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

EDT/SwingWorker Java Discussion :

Plusieurs Threads et InvokeLater


Sujet :

EDT/SwingWorker Java

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2014
    Messages : 9
    Points : 9
    Points
    9
    Par défaut Plusieurs Threads et InvokeLater
    Bonsoir à tous

    Je me permets de solliciter votre aide !

    Dans le code suivant :

    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
    			final StatusDialog dg = StatusDialog.getStatusDialog(this,
    					"", false);
    			final Iterator<AbstractDataProvider> itr = todo.iterator();
    			AbstractDataProvider prov;
    			final RefBoolean finished = new RefBoolean();
    			while (itr.hasNext())
    			{
    				finished.setVal(false);
    				prov = itr.next();
    				dg.setTitle(prov.toString());
    				prov.execute(prov.toString(), source, target,
    						this.multithreadCheckBox.isSelected(),
    						this.logTextArea, new Runnable() {
     
    							@Override
    							public void run() {
    								finished.setVal(true);
    							}
    						}, dg);
    				while (!finished.getVal())
    					Thread.sleep(1000);
    				i = providerComboBox.getSelectedIndex();
    				this.providerComboBox.removeAll();
    				for (AbstractDataProvider provider : DataProviderFactory
    						.getProviders()) {
    					this.providerComboBox.addItem(provider);
    				}
    				providerComboBox.setSelectedIndex(i);
    			}
    			dg.dispose();
    ... on exécute chaque élément de la liste todo (cela se fait dans une autre partie du code) dans un nouveau thread. De plus, chacun de ces threads lance un ExecutorService qui lui même va lancer pleins de threads différents. On ne passe pas à l'élément suivant de la liste todo tant que l'ExecutorService n'a pas terminé la tâche. Et juste avant de passer à l'élément suivant de la liste todo le new Runnable que l'on voit ci-dessus est lancé dans le thread de l'élément en cours de la liste todo. (Vous suivez )

    De plus, la variable dg est une boîte de dialogue censée afficher la progression des ExecutorService (le pourcentage est mis à jour chaque fois qu'un Thread d'un ExecutorService se termine), et elle contient aussi un bouton mettant fin à l'ExecutorService.

    Le problème, c'est que toutes les tâches demandées s'effectuent correctement mais la boîte de dialogue reste désespérément vide jusqu'à ce que toutes les tâches aient été exécutées...

    Voici encore les deux fonctions de la classe StatusDialog permettant respectivement de mettre à jour la barre de progression et de mettre fin à l'ExecutorService en cours en cliquant sur le bouton :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    	public void setProgress(final int value) {
     
    		SwingUtilities.invokeLater(new Runnable() {
     
    			@Override
    			public void run() {
     
    				StatusDialog.this.pb.setValue(value);
    				StatusDialog.this.pb.invalidate();
    			}
    		});
    	}
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    	public void listenExecutor(final ExecutorService pool)
    	{
    		cancel.addActionListener(new ActionListener() {
    			public void actionPerformed(ActionEvent arg0) {
    				canceled = true;
    				pool.shutdownNow();
    			}
    		});
    	}
    Quelqu'un aurait-il une solution à mon problème ? Merci d'avance

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Ben comme toujours dans ces cas là, c'est parce que tu squatte le thread EDT et que donc aucun affichage ne peux se faire pendant ce temps là.
    Ce qui est amusant c'est que tu parle de swingWorker dans ton titre, mais tu n'en utilise pas. Hors en utiliser un aurais résolu ton problème

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2014
    Messages : 9
    Points : 9
    Points
    9
    Par défaut
    En fait je voulais dire SwingUtilities.InvokeLater et non SwingWorker. (J'ai corrigé le titre)

    Et justement je pensais que l'utilisation d'InvokeLater (que j'emploie dans la boîte de dialogue) devait justement éviter ce problème...

    Où mettrais-tu un SwingWorker ?

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2014
    Messages : 9
    Points : 9
    Points
    9
    Par défaut
    Bon finalement j'ai contourné le problème en créant une boîte de dialogue pour chaque élément de la liste todo plutôt que d'utiliser chaque fois la même. Cela me permet d'avoir un bouton d'annulation pour chaque tâche de la liste et de les lancer toutes en même temps. Ceci dit je n'ai pas vraiment compris où précisément ça coinçait.

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    invokeLater sert à lancer quelquechose sur l'EDT sans attendre son résultat. Cela n'empêche pas que ce quelquechose bloquera l'EDT. C'est destiné à pouvoir executé, depuis un autre thread, des instruction sur l'EDT car on ne manipule pas les composants graphiques en dehors de l'EDT en java.

    la différence entre invokeLater et invokeAndWait tient au fait que la dernière attends que l'opération (le quelquechose) soit terminé avant de retourner.

    Swingworker est destiné à travailler avec cela + un thread séparé pour les calculs long, et facilite le travail de mise à jour de l'interface depuis le thread de travail, via ses méthodes publish / process

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2014
    Messages : 9
    Points : 9
    Points
    9
    Par défaut
    OK merci pour ton explication ! ...et désolé de ne réagir que maintenant. J'y songerai la prochaine fois que je devrai travailler là-dessus

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

Discussions similaires

  1. RS232: Un seul ou plusieurs threads?
    Par cfalcot dans le forum API, COM et SDKs
    Réponses: 5
    Dernier message: 01/04/2006, 23h01
  2. plusieurs threads ecrivent sur la meme socket
    Par estergiou dans le forum C++
    Réponses: 3
    Dernier message: 04/11/2005, 01h38
  3. un ou plusieurs threads?
    Par greg13 dans le forum Windows
    Réponses: 16
    Dernier message: 21/10/2005, 20h39
  4. [Thread]Comment créer plusieurs thread à la demande??
    Par Devil666 dans le forum Concurrence et multi-thread
    Réponses: 8
    Dernier message: 14/09/2005, 13h29
  5. création de plusieurs threads dans WinMain
    Par ChidoriRasengan dans le forum DirectX
    Réponses: 1
    Dernier message: 15/06/2005, 21h36

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