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:
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);
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) ).

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:
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);
Mais cela n'a aucun effet.

Quelqu'un aurait une idée?
Et je reprécise : je ne peux pas lancer le long traitement dans un autre Thread.