Bonjour,
Nouveau en Java & en jFace, j'ai une fenêtre qui se gèle sur un traitement long. Après recherche sur internet, j'ai testé des tas de solutions sans succès. Je suis dessus depuis 24H, et ça commence à être pénible.
Plus précisément, j'ai une WizardPage jFace avec un Button et une ProgressBar.
Lorsque le Button est cliqué, il déclenche un traitement long effectué dans un thread annexe.
Le gestionnaire d'événement de ce Button instancie le Thread et le start() dans la foulée.
Ce Thread déclenche des événements écoutés par la WizardPage pour l'informer de la progression du traitement.
Celle-ci met alors à jour la ProgressBar dans le gestionnaire associé. Tout fonctionne sauf que la fenêtre ne répond quasiment pas et si j'arrive à la déplacer, la ProgressBar ne se met plus à jour. Bref, soit la ProgressBar se met à jour, soit je peux bouger la fenêtre mais pas les deux
Une idée ? la suite plus bas.
Ça marche pas. J'ai notamment la section suivante dont les résultats me semblent étranges.
Dans ce qui suit le "AVANT" est affiché, pas le après !
Voici le code :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 System.out.println("AVANT"); myThreadTest.start(); System.out.println("APRES");
### Mon StepEvent ###
### Mon StepEventListener ###
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 import java.util.EventObject; public class StepEvent extends EventObject { public int step; public StepEvent(int iStep) { super(iStep); this.setStep(iStep); } public int getStep() { return this.step; } private void setStep(int iStep) { this.step = iStep; } }
### Ma WizardPage ###
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 import java.util.EventObject; public interface StepEventListener { public void handleStepEvent(EventObject e); }
### Mon handler pour le Button Clic ###
### Mon handler pour le StepEvent ###
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 public void handleEvent(Event iEvent) { ThreadTest myThreadTest = new ThreadTest(); myThreadTest.addStepEventListener(this); ... System.out.println("AVANT"); myThreadTest.start(); System.out.println("APRES"); ... }
### Mon THREAD ###
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 public void handleStepEvent(EventObject e) { pbProcess.setSelection(((StepEvent) e).getStep()); }
### Mon myThreadTest.start() ###
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 private ArrayList<StepEventListener> stepEventlisteners = new ArrayList<StepEventListener>(); public synchronized void addStepEventListener(StepEventListener iStepEventListener) { this.stepEventlisteners.add(iStepEventListener); } public synchronized void removeStepEventListener(StepEventListener iStepEventListener) { this.stepEventlisteners.remove(iStepEventListener); } private synchronized void sendStepEvent(int iStep) { for (StepEventListener myStepEventListener : this.stepEventlisteners) { myStepEventListener.handleStepEvent(new StepEvent(iStep)); } }
Merci d'avance pour vos conseils / liens.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 while (...) { ... this.sendStepEvent(myPercent); ... }
Partager