Bouton pour sortir d'une boucle
Bonsoir à tous :zoubi: (c'est mon premier post)
Je me résigne à demander de l'aide car je n'arrive pas à résoudre le problème suivant. Dans le code :
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 31 32 33 34 35 36 37 38 39 40 41
| private boolean doTask(final LinkedHashMap<String, Long> map,
boolean multithreaded, final boolean firstPass, final int count, StatusDialog dg) {
Logger.log("Running instance for: " + this.toString());
final AtomicInteger processed = new AtomicInteger();
ExecutorService pool;
if (multithreaded) {
Logger.log("Multithread execution");
pool = Executors.newCachedThreadPool();
} else {
Logger.log("Singlethread execution");
pool = Executors.newSingleThreadExecutor();
}
dg.listenMap(map);
for (final String key : map.keySet()) {
if (firstPass || map.get(key) == 0 || map.get(key) == -1)
{
pool.execute(new Runnable() {
@Override
public void run() {
long val = Database.this.doQuery(key);
Logger.log(key + " " + val);
map.put(key, val);
Database.this.reportProgress(100
* processed.incrementAndGet() / count);
}
});
}
}
try {
// all submitted tasks will be executed. wait for the pool to
// shutdown
pool.shutdown();
// returns true on success, false on timeout
return pool.awaitTermination(Long.MAX_VALUE, TimeUnit.SECONDS);
} catch (InterruptedException e) {
Logger.log("Task execution failed. Not all queries completed");
return false;
}
} |
... la boîte de dialogue de type StatusDialog nommée dg contient une barre de progression qui indique l'avancement du contenu de la boucle for. J'y ai ajouté un bouton Annuler, et je souhaiterais qu'un clic sur celui-ci arrête la boucle for du code ci-dessus et par conséquent que celle-ci cesse de lancer des nouveaux Runnable.
Ne sachant pas trop comment procéder, j'ai essayé de procéder de la façon suivante. Dans la classe de la StatusDialog, j'ai rajouté la fonction suivante :
Code:
1 2 3 4 5 6 7 8 9
| public void listenMap(final LinkedHashMap<String, Long> map)
{
cancel.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
map.clear();
// StatusDialog.this.dispose();
}
});
} |
...où cancel est le bouton Annuler. J'appelle cette fonction avant la boucle for à l'aide de , dans l'espoir qu'un clic sur le bouton vide la map et ainsi que la boucle for, n'ayant plus rien à se mettre sous la dent, soit forcée de s'arrêter.
Mais, évidemment puisque je demande de l'aide, cela ne marche pas.
Comment faire pour que la boucle for s'arrête et cesse de lancer des nouveaux Runnable ?
Merci d'avance pour vous éventuelles réponses :zoubi: