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 :

Mettre en pause plusieurs Jprogress Bar


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Octobre 2009
    Messages
    29
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Octobre 2009
    Messages : 29
    Par défaut Mettre en pause plusieurs Jprogress Bar
    Salut tout le monde,
    Je développe actuellement un aspirateur de site multithread. J'associe chaque thread d'aspiration à une JprogressBar afin de visualiser l'état de l'avancement. Ceci marche correctement. Cependant je voudrai implémenter un bouton "Pause" voici ce que j'ai fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public void setPause(ArrayList<Thread> list) {
    for(Thread th : list) {
      synchronized(th) {th.wait();}
    }
    IL ne lit que le premier élément de ma liste qui correspond à ma première JprogressBar et freeze mon interface. Quand j'exécute en mode debug, on voit qu'il reste bloqué sur th.wait() et qu' il n'en sort jamais.

    Si je ne met pas le synchronized j'obtient il jette l'exception suivante :
    Exception in thread "AWT-EventQueue-0" java.lang.IllegalMonitorStateException: current thread not owner.

    Quelqu'un a déjà eut ce problème?

    Cdt
    Cédric

  2. #2
    Expert éminent
    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 : 46
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    je crosi que vous n'avez pas bien lu la documentation ce que fait wait
    ca met en pause le thread courant (donc ici le thread de l'edt) jusqu'à ce qu'un autre thread appelle a méthode notify() sur le même objet.

  3. #3
    Membre averti
    Inscrit en
    Octobre 2009
    Messages
    29
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Octobre 2009
    Messages : 29
    Par défaut
    Bin le souci c que je vois pas comment appeler une méthode notify() en sachant que tout est bloqué. Initialement c'est ce qui est prévu : lorsqu'on clique sur le bouton "pause" toutes les ProgressBar s'arrêtent, et lorsqu'on clique sur "resume", la progression reprend la où elle s'était arrêtée.
    Mais comme tout est bloqué je ne peux pas cliquer sur le bouton "resume" pour exécuter notifyAll(). Je sais pas si je m'explique bien en fait :s

  4. #4
    Membre averti
    Inscrit en
    Octobre 2009
    Messages
    29
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Octobre 2009
    Messages : 29
    Par défaut
    Cela signifie-t-il qu'il faut détacher la thread de l'interface?
    Si oui comment faire?

  5. #5
    Expert éminent
    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 : 46
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    tout n'est pas bloqué, seule votre interface est bloquée.

    Si vous voulez que les threads attendent, c'est dans les threads qu'il faut mettre le code gérant la pause. Votre code n'aura qu'à faire, pour la mise en pause:


    leThread.setPause(true);

    et pour la remise en route
    leThread.setPause(false);


    quand vous appelez wait/notify/notifyAll, l'objet sur lequel vous l'appelez n'est qu'un sémaphore qu'on va lever (notify/notifyAll) ou qu'on va attendre (wait). Donc c'est toujours le thread à mettre en pause qui appelle wait() et le thread qui réveille l'autre qui appellera notify/notifyAll.

  6. #6
    Membre averti
    Inscrit en
    Octobre 2009
    Messages
    29
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Octobre 2009
    Messages : 29
    Par défaut
    MErci beaucoup pour cette réponse. Ce qui me permet d'embrayer sur la prochaine question : comment fait on lorsqu'on a un pool de thread?

Discussions similaires

  1. Mettre une pause dans un programme
    Par PNL dans le forum Général Java
    Réponses: 12
    Dernier message: 28/01/2016, 00h54
  2. [VB6] Mettre en pause l'execution du code
    Par ironik dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 19/05/2006, 10h56
  3. [FLASH MX2004] Comment mettre une pause dans un script
    Par vbcasimir dans le forum Flash
    Réponses: 3
    Dernier message: 16/02/2006, 09h47
  4. Mettre a jour plusieurs lignes d'une table
    Par Tartenpion dans le forum Langage SQL
    Réponses: 4
    Dernier message: 17/12/2005, 18h50
  5. Mettre en pause le Timer !
    Par NaDiA_SoFt dans le forum C++Builder
    Réponses: 14
    Dernier message: 12/09/2003, 21h32

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