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
    Membre habitu�
    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2014
    Messages
    9
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 42
    Localisation : Suisse

    Informations professionnelles :
    Activit� : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2014
    Messages : 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
    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
    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
    Membre habitu�
    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2014
    Messages
    9
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 42
    Localisation : Suisse

    Informations professionnelles :
    Activit� : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2014
    Messages : 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
    Membre habitu�
    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2014
    Messages
    9
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 42
    Localisation : Suisse

    Informations professionnelles :
    Activit� : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2014
    Messages : 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
    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
    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
    Membre habitu�
    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2014
    Messages
    9
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 42
    Localisation : Suisse

    Informations professionnelles :
    Activit� : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2014
    Messages : 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