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

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

    Informations forums :
    Inscription : Août 2008
    Messages : 381
    Points : 263
    Points
    263
    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 actif Avatar de Balbuzard
    Profil pro
    Inscrit en
    Août 2008
    Messages
    381
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

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

    ...

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

    Informations forums :
    Inscription : Février 2007
    Messages : 88
    Points : 98
    Points
    98
    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
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Points : 4 141
    Points
    4 141
    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 régulier
    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
    Points : 73
    Points
    73
    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 actif Avatar de Balbuzard
    Profil pro
    Inscrit en
    Août 2008
    Messages
    381
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 381
    Points : 263
    Points
    263
    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 :-)

  7. #7
    Membre averti
    Profil pro
    Développeur Java
    Inscrit en
    Novembre 2007
    Messages
    301
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2007
    Messages : 301
    Points : 368
    Points
    368
    Par défaut
    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
     
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.SwingUtilities;
     
    @SuppressWarnings("serial")
    public class Test extends JFrame implements ActionListener {
     
    	private Task task = new Task();
     
    	public Test() {
    		super();
    		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
     
    		JButton startButton =new JButton("Start");
    		startButton.setActionCommand("Start");
    		startButton.addActionListener(this);
     
    		JButton pauseButton =new JButton("Pause");
    		pauseButton.setActionCommand("Pause");
    		pauseButton.addActionListener(this);
     
    		JButton canceButton =new JButton("Cancel");
    		canceButton.setActionCommand("Cancel");
    		canceButton.addActionListener(this);
     
    		JPanel panel = new JPanel();
    		panel.add(startButton);
    		panel.add(pauseButton);
    		panel.add(canceButton);
     
    		this.add(panel);
    		this.pack();
    	}
     
    	@Override
    	public void actionPerformed(ActionEvent actionEvent) {
    		if(actionEvent.getActionCommand().equals("Start")) {
    			System.err.println("Start");
    			task.start();
    		} else if(actionEvent.getActionCommand().equals("Cancel")) {
    			System.err.println("Cancel");
    			task.stop();
    		} else {
    			System.err.println("Pause");
    			if(task.isPaused()) {
    				task.unpause();
    			} else {
    				task.pause();
    			}
    		}
    	}
     
    	public static void main(String[] args) {
    		SwingUtilities.invokeLater(new Runnable() {
    			@Override
    			public void run() {
    				JFrame jFrame = new Test();
    				jFrame.setVisible(true);
    			}
    		});
    	}
     
    	private static class Task implements Runnable {
     
    		private volatile Thread thread;
    		private volatile boolean paused;
     
    		public void start() {
    			thread = new Thread(this);
    			thread.start();
    		}
     
    		public void stop() {
    			thread = null;
    		}
     
    		public void pause() {
    			this.paused = true;
    		}
     
    		public void unpause() {
    			this.paused = false;
    			if(this.thread != null) {
    				synchronized(this.thread) {
    					this.thread.notify();
    				}
    			}
    		}
     
    		public boolean isPaused() {
    			return this.paused;
    		}
     
    		@Override
    		public void run() {
    			final Thread currentThread = Thread.currentThread();
    			while(currentThread == this.thread) {
    				try {
    					System.out.println("execute");
    	                Thread.sleep(1000);
    	            } catch (InterruptedException e){
    	            	System.err.println("The thread has been interrupted");
    	            }
     
    	            if(this.thread != null) {
    		            synchronized(this.thread) {
    		            	while(this.paused) {
    		            		try {
    		            			this.thread.wait();
    							} catch (InterruptedException e) {
    								System.err.println("The thread has been interrupted");
    							}
    		            	}
    		            }
    	            }
    			}
    		}
    	}
    }

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

    Informations forums :
    Inscription : Août 2008
    Messages : 381
    Points : 263
    Points
    263
    Par défaut
    Merci beaucoup pour ta réponse que je suis en train de tester;

    Je suis notamment en train de le réadapter pour qu'il prenne en compte les modifications graphiques et tout se passe NICKEL.
    J'ai enfin pu trouver une réponse pour mes soucis de Threads et je crois que je suis en train de m'en sortir :-D

    Merci encore :-)

+ 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