Plusieurs Threads et InvokeLater
Bonsoir à tous :zoubi:
Je me permets de solliciter votre aide !
Dans le code suivant :
Code:
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 :lol:)
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:
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:
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 :zoubi: