Bonjour!
J'ai un problème que je n'arrive pas à résoudre, voici le contexte:
J'ai une application RCP (avec SWT donc), qui sur un clic sur un bouton lance une tâche qui peut durer jusqu'à 1 minute.
J'ai donc mis en place une fenêtre d'attente avec progress bar durant la durée de la tâche:
Le problème c'est que durant le traitement, je fais certaines chose qui font que je ne peux pas lancer le ProgressMonitorDialog dans un autre thread (avec d.run(true, true, op) ).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 final IRunnableWithProgress op = new IRunnableWithProgress() { public void run(final IProgressMonitor monitor) throws InterruptedException, InvocationTargetException { monitor.beginTask("Start tache", 0); ... traitement durant 1 minute ... } }; final ProgressMonitorDialog d = new ProgressMonitorDialog(Display.getCurrent().getActiveShell()); d.run(false, false, op);
Et donc si j'ai le malheur de faire un clic lorsque le ProgressMonitorDialog est ouvert, il se bloque le ThreadUI étant bloque par le traitement de la tâche:
Et window me demande gentiment si je veux sauvagement fermer mon application puisqu'elle ne répond pas.
Je voudrai donc savoir si j'ai un moyen de dé-freezer mon appli dans le code?
J'ai essayé durant le traitement de faire des Thread.yield(), ou alors de lancer un autre Thread qui fait:
Mais cela n'a aucun effet.
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 final ProgressMonitorDialog d = new ProgressMonitorDialog(Display.getCurrent().getActiveShell()); new Thread() { public void run() { for (final int[] i = new int[1]; i[0] <= 9999999; i[0]++) { try { Thread.sleep(100); } catch (Throwable th) { } if (display.isDisposed()) return; display.asyncExec(new Runnable() { public void run() { d.getProgressMonitor().beginTask(i[0]+"", i[0]); shell.redraw(); } }); } } }.start(); d.run(false, false, op);
Quelqu'un aurait une idée?
Et je reprécise : je ne peux pas lancer le long traitement dans un autre Thread.
Partager