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

Java Discussion :

Threads : pause et reprise avec JButton


Sujet :

Java

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 9
    Points : 8
    Points
    8
    Par défaut Threads : pause et reprise avec JButton
    Bonjour,

    J'ai un petit soucis en essayant d'intégrer un mode pause/reprise dans mon application Java.
    En gros : j'ai une JFrame qui récupère des paramètres puis lance un Thread. Ce thread est d'exécution longue. Le JFrame garde la référence de chaque Thread lancé.
    J'aimerai permettre à l'utilisateur de mettre pause dans l'analyse (le Thread donc) et de pouvoir la faire reprendre par un nouveau clic.

    J'ai testé pour la pause :
    synchronized(t) {
    t.wait(360000);
    }
    et pour la reprise :
    synchronized(t) {
    t.notify();
    }

    Mais la mise pause bloque complètement la JFrame...Ce qui, bien sur n'est pas le but !
    D'autre part, je n'arrive pas à tester si le Thread est déjà en pause ou pas...

    J'ai aussi essayé avec Thread.sleep(x_milliseconds) mais visiblement ce n'est pas possible de faire reprendre le thread avant les x_milliseconds.

    Quelqu'un pourrait m'aider ???

    Merci d'avance

  2. #2
    Membre actif Avatar de hydraland
    Profil pro
    Développeur Java
    Inscrit en
    Mai 2006
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mai 2006
    Messages : 179
    Points : 239
    Points
    239
    Par défaut
    Salut,

    Dans la méthode run de ton thread tu dois avoir des "points de pause" de ton thread. Ton IHM activerait ou libérerait ton thread de ces "points de pause". Comme un exemple vaut mieux qu'un long discourt ci-dessous un exemple.
    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
    public class TestPause implements Runnable
    {
    	/** Indique si le traitement du thread est arrêté. */
    	private volatile boolean pause = false;
     
    	/*
    	 * (non-Javadoc)
    	 * @see java.lang.Runnable#run()
    	 */
    	public void run()
    	{
    		//... Code du traitement
    		//Point de pause
    		if(pause)
    		{
    			waitThread();
    		}
    		//... Code du traitement
    	}
     
    	/**
             * Méthode permettant d'arrêter le traitement du thread.
             */
    	private void waitThread()
    	{
    		synchronized(this)
    		{
    			try
    			{
    				this.wait();
    			}
    			catch (InterruptedException ie)
    			{
    				ie.printStackTrace();
    			}
    		}
    	}
     
    	/**
             * Méthode à appeler pour arrêter le traitement du thread.
             */
    	public void pause()
    	{
    		pause = true;
    	}
     
    	/**
             * Méthode de reprise du traitement du thread.
             */
    	public void resume()
    	{
    		pause = false;
    		synchronized(this)
    		{
    			this.notifyAll();
    		}
    	}
    }
    A+
    Hydraland

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 23
    Points : 27
    Points
    27
    Par défaut
    Salut,

    je n'est jamais fait cela avant (de bloquer un thread en cours d'exécution) mais je me demander tes threads ils font quoi exactement ?
    Parce que s'ils agissent directement sur ta frame c'est peut être pour sa que sa bloque. Tu devrai mettre l'objet, le bouton.... sur quoi ils agissent en dehors de ta frame.

    Tu pourrait mettre un bout de ton code, peut être que je pourrais t'aider.

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 9
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par hydraland Voir le message
    Salut,

    Dans la méthode run de ton thread tu dois avoir des "points de pause" de ton thread. Ton IHM activerait ou libérerait ton thread de ces "points de pause". Comme un exemple vaut mieux qu'un long discourt ci-dessous un exemple.
    Hydraland
    Tout d'abord, merci pour ta réponse. Le petit problème c'est qu'en réalité je n'ai pas été assez précis...
    En fait mon thread n'est pas un Thread !
    Pour être clair, je lance la classe qui effectue les analyses comme suit,
    à partir de la JFrame principale (JFrameMain) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Thread th = new Thread() {
    	public void run() {
    		WorkingClass test = new WorkingClass();
    	      test.run(params,JFrameMain.this,area,resultsFrame);
    	}
    };
    th.start();
    Ceci étant du à l'évolution de l'application qui ne lançait pas de thread
    à la base... Certes ce n'est certainement pas ce qu'il y a de plus propre.

    Bref, malheureusement je ne pense pas pouvoir utiliser ce que tu as mis
    dans ton code ou alors il faudrait que je modifie la classe pour qu'elle implémente Runnable...

    Ou connais-tu une autre solution qui m'éviterait ces changements ?

    Merci bien en tout cas

  5. #5
    Membre actif Avatar de hydraland
    Profil pro
    Développeur Java
    Inscrit en
    Mai 2006
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mai 2006
    Messages : 179
    Points : 239
    Points
    239
    Par défaut
    Salut,

    Ta classe n'a pas besoin d'être un Thread ou un Runnable pour implémenter l'exemple que je t'ai donné. L'important c'est que ton instance de classe soit "dans un Thread" comme cela semble être le cas.

    A+
    Hydraland

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 9
    Points : 8
    Points
    8
    Par défaut
    Salut,

    Merci bien hydraland pour on aide.
    Problème résolu !

    A+

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

Discussions similaires

  1. Problème avec JButton
    Par bressan dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 20/06/2006, 13h01
  2. [win32] threads, suspension et reprise
    Par xilebo dans le forum Windows
    Réponses: 7
    Dernier message: 14/02/2006, 14h24
  3. [Applet+Threads] Pause et resume qui fonctionne pas
    Par MinsK dans le forum Concurrence et multi-thread
    Réponses: 4
    Dernier message: 29/11/2005, 18h39
  4. pause et reprise de thread
    Par raggadoll dans le forum C++Builder
    Réponses: 5
    Dernier message: 12/07/2003, 10h50
  5. Pause et reprise d'un thread
    Par raggadoll dans le forum Linux
    Réponses: 5
    Dernier message: 03/07/2003, 20h22

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