Bonjour,
Je développe un modèle de simulation des courants marins.
Je dispose d'un objet Simulation chargé de faire les calculs et d'une MainFrame (l'interface graphique) qui me permet de piloter la simulation et d'afficher le mouvement des courants.
L'objet Simulation offre une méthode initSimu() et une méthode runSimu().
La MainFrame contient :
* bouton "Init" qui initialise la simulation (lecture d'un fichier configuration).
* bouton "Run" qui lance son exécution.
* un JPanel "panelSimu" où sont dessinés les courants marins.
J'utilise un SwingWorker pour initialiser la simulation (appelons le sw_init) et un SwingWorker pour exécuter la simulation (appelons le sw_run).
sw_run est fichu pareil sauf qu'il lance en background la procédure simulation.runSimu()
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 sw_init { @Override protected Object doInBackground() throws Exception { simulation.initSimu(); //lit les paramètres dans un fichier et initialise les variables de la simulation return null; } @Override protected void done() { // Affiche sur le JPanel le domaine géographique de la simulation panelSimu.repaint() }
Un click sur le bouton "Init" appelle sw_init.execute().
Un click sur "Run" appelle sw_run.execute().
Pour que le programme tourne bien, il ne faut pas que la méthode runSimu() s'exécute avant que initSimu() soit finie.
Problèmes rencontrés à l'exécution : si je clique sur Init et j'attends que la tâche soit complètement exécutée avant de cliquer sur Run, il n'y a aucun problème. Si je clique sur Init et juste après sur Run, et bien la simu tente de tourner alors qu'elle n'a pas fini de s'initialiser et plante.
Une solution facile, consiste à désactiver le bouton Run tant que l'initialisation n'est pas terminée. Mais je veux que l'utilisateur puisse cliquer successivement sur Init et Run, et que le programme gère la synchro des SwingWorkers.
Ma question : Comment dois-je synchroniser mes deux SwingWorkers (je dis deux dans cet exemple, mais ma question vaut pour plusieurs SW) ? Je n'arrive pas à utiliser correctement wait() and notifyAll(), et le mot-clé Synchronized au sein des SwingWorkers.
Le post est un peu long, pardon, mais je préfère donner toute l'information dès le début. D'avance merci pour vos éclaircissements.
Philippe.
Partager