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

avec Java Discussion :

[Thread] Re"starter" un Thread


Sujet :

avec Java

  1. #1
    Membre habitué
    Avatar de moithibault
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juin 2009
    Messages : 124
    Points : 142
    Points
    142
    Par défaut [Thread] Re"starter" un Thread
    Bonjour,

    Je souhaite faire un compteur, avec une JProgressBar qui augmente, dans une application au moyen d'un Thread. Donc, le compteur s'éxecute en même temps que mon programme principal.

    Mon code est dans la méthode run() et ma classe implémente la classe Runnable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public void run() {
     
        while (this.i < TEMPS_PARTIE) {
     
            this.bar.setValue(this.i);
            this.i++;
     
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    En fait, j'aimerais pouvoir remettre à 0 le compteur comme je veux et le voir graphiquement.
    J'ai donc fait un attribut i que je peux modifier et du coup je peux remettre le compteur à la valeur que je veux. Et cela uniquement si la boucle while n'est pas terminée et c'est bien là le problème !

    Une fois la boucle terminée, je ne reboucle pas. J'ai essayé avec une boucle while (true) imbriquée mais mon application était très lente. Du coup je suis sur qu'il y a une solution simple mais je ne la connais pas.

    Quelqu'un saurait-il m'indiquer comment procéder ?

    Merci d'avance pour votre aide.

  2. #2
    Membre éclairé Avatar de JoeChip
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    536
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2008
    Messages : 536
    Points : 803
    Points
    803
    Par défaut
    Les "this" sont normalement inutiles ici, ça donne donc ça, y compris une simplification sur l'incrémentation de i :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    public void run() {
     
        while (i < TEMPS_PARTIE) {
     
            bar.setValue(i++);
     
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    Après, si j'ai bien compris, tu veux pouvoir relancer la boucle quand elle est finie et que tu mets une nouvelle valeur ; il suffit peut-être de refaire "start" dans le cas où elle est finie ?


    moi je ferais un truc genre un boolean appellé "running" dans le thread, ce qui ferait :
    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
     
    public void run() {
        int i=0; running=true;
        while (running) {
     
            bar.setValue(i);
            running = (++i < TEMPS_PARTIE);
     
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    ce qui permet alors de tester "running", et aussi de l'utiliser pour arrêter le thread avec un bouton "stop", par exemple etc

  3. #3
    Membre éprouvé

    Homme Profil pro
    Développeur J2EE Senior
    Inscrit en
    Mai 2008
    Messages
    419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur J2EE Senior
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mai 2008
    Messages : 419
    Points : 900
    Points
    900
    Par défaut
    Salut

    Voici une suggestion:

    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
    	private boolean boucle = true;
     
    	public void run() {
     
    	    while (boucle) {
     
    	        if (i < TEMPS_PARTIE) {
    			bar.setValue(i);
    			i++;
    		}
     
    		try {
    	            Thread.sleep(1000);
    	        } catch (InterruptedException e) {
    	            e.printStackTrace();
    	        }
    	    }
    	}
    Pour interrompre définitivement le Thread au moment de quitter l'application, il faudra utiliser un setter pour passer le booléen "boucle" à false.

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    Le plus simple pour moi:

    ta classe principale doit implémenter Runnable plutot que d'étendre Thread.

    A chaque fois que tu veux le relancer, si il est bien arrêté, tu fais un

    new Thread(monRunnable).start();


    En effet, un Runnable peux servir autant de fois que tu veux, mais on ne peux appeler qu'un seule fois start sur un thread (d'ou la nécessiter de créer un nouveau thread à chaque fois).

  5. #5
    Membre habitué
    Avatar de moithibault
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juin 2009
    Messages : 124
    Points : 142
    Points
    142
    Par défaut
    Au final j'ai laissé ma solution avec un while(true) en plus et un Thread.sleep(100) histoire que ça boucle pas trop vite

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

Discussions similaires

  1. Fichier ecrit par un Thread et lu par un autre Thread
    Par Fladnag dans le forum Entrée/Sortie
    Réponses: 6
    Dernier message: 27/04/2004, 14h56

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