Bonsoir à tous (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 :
... 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.
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
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; } }
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 :
...où cancel est le bouton Annuler. J'appelle cette fonction avant la boucle for à l'aide de
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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(); } }); }, 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.
Code : Sélectionner tout - Visualiser dans une fenêtre à part dg.listenMap(map);
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
Partager