IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

AWT/Swing Java Discussion :

Thread problème de mise en pause dans des éléments Swing


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Balbuzard
    Profil pro
    Inscrit en
    Août 2008
    Messages
    381
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 381
    Par défaut Thread problème de mise en pause dans des éléments Swing
    J'ai testé le code suivant en suivant d'ailleurs un totu du site, qui me dit que les élémens graphgiques doivent être exécutés dans l'EDT, donc j'ai mis tout ce qui concerne la réactualisation graphique dans des SwingUtilities.invokeLater(...)

    Je veux que mon Thread Calcul (la classe Calcul étend Thread) se stoppe lors de l'appui sur le bouton

    Voici mon code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    public void run()
    	{
    		final int [] finalInt =new int[1];
    		finalInt[0]=nombre;
    	    while(true)
    	    {
    	    	finalInt[0]++;
    	    	Runnable code=new Runnable() {
    	    		public void run() {
    	    			essai.getLabel().setText("The Number is : "+finalInt[0]);
    	    		}
    	    	};
    	    	try{
    	    		SwingUtilities.invokeAndWait(code);
    	    	}catch(InvocationTargetException ite) {ite.printStackTrace();}
    	    	catch(InterruptedException ie) {ie.printStackTrace();}
    			essai.setNombre(finalInt[0]);
    	    }
    	}
    L'interface graphique comporte des boutons :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    public void actionPerformed(ActionEvent arg0)
    	{
    		if(arg0.getActionCommand().equals("Start"))
    		{
    			calcul.start();
    		}
    		if(arg0.getActionCommand().equals("Pause"))
    		{
    			synchronized(calcul) {
    				try{
    					wait();
    				}catch(InterruptedException ie) {ie.printStackTrace();}
    			}
    		}
    		if(arg0.getActionCommand().equals("ReStart"))
    		{
    			synchronized(calcul) {
    				calcul.notify();
    			}
    		}
    	}
    Il n'y a pas de messages d'erreurs en faisant start puis pause, mais le Thread ne s'arrête pas et continue de s'exécuter.
    Quelqu'un pourrait-il me donner un coup de main pour comprendre le problème?
    Merci vivement d'avance :-)

  2. #2
    Membre éclairé Avatar de Balbuzard
    Profil pro
    Inscrit en
    Août 2008
    Messages
    381
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 381
    Par défaut
    N'y a-t-il vraiment personne pour me donner un coup de main?

    ...

  3. #3
    Membre éclairé Avatar de DjGonk
    Profil pro
    Inscrit en
    Février 2007
    Messages
    88
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 88
    Par défaut
    Simple remarque tu veux mettre en pause le thread ou l'arreter définitivement?

    Sinon le en regardant ton code je vois que le wait ne concerne pas ton thread calcul mais plutôt ton ihm.

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 276
    Par défaut
    http://java.sun.com/j2se/1.4.2/docs/...precation.html

    Jette un oeil à ce lien, tu devrais y trouver ton bonheur.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    127
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 127
    Par défaut
    Je vois deux façons de faire :
    - méthode bourrin : tonThread.interrupt();
    - sinon utiliser un SwingWorker (ce qui est nettement plus propre)

  6. #6
    Membre éclairé Avatar de Balbuzard
    Profil pro
    Inscrit en
    Août 2008
    Messages
    381
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 381
    Par défaut
    @ DjGonk: En fait, je veux le mettre en pause jusqu'à ce que l'utilisateur le remettre en route à l'aide d'un autre bouton. Donc le Thread calcul se met en wait() et est réveillé par le Thread courant exécuté lors de l'appuis sur la touche par l'utilisateur.

    J'ai aussi l'impression que mon Thread ne se stope pas parce que je ne mets pas le wait au bon Thread, mais je ne wait pas l'IHM non plus, car elle reste réactive.


    C'est bien là, mon problème, je ne sais pas comment faire pour que la machine comprenne que c'est sur le Thread calcul que je souhaite agir.

    Si je mets:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    if(arg0.getActionCommand().equals("Pause"))
    		{
    			synchronized(calcul) {
    				try{
    					calcul.wait();
    				}catch(InterruptedException ie) {ie.printStackTrace();}
    			}
    		}
    alors, lorsque calcul entre dans le bloc synchronized, il se met en wait et plus aucun Thread ne peut faire quoique ce soit, car calcul est en wait, et du fait du synchronized, les autres attendent qu'il ait terminé!!

    Si quelqu'un voit une façon de faire, ce serait cool.
    Quant à moi, je vais voir les SwingWorker et le tutoriel sun comme me le suggèrent barbiche et fr1man

    Merci pour vos réponses :-)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [WD15] Problème de dédoublement de ligne dans des tables fichiers
    Par lololebricoleur dans le forum WinDev
    Réponses: 14
    Dernier message: 20/09/2010, 10h53
  2. [AC-2000] Problème de mise en forme dans état
    Par etoileetoile dans le forum IHM
    Réponses: 1
    Dernier message: 12/10/2009, 22h37
  3. [WD-2003] Problème de mise en forme dans les renvois
    Par formabox dans le forum Word
    Réponses: 10
    Dernier message: 02/06/2009, 09h20
  4. Problème de mise en forme dans une liste personnalisée
    Par smarties dans le forum AWT/Swing
    Réponses: 13
    Dernier message: 17/01/2007, 15h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo