Bonjour,

Je me suis sorti de mes problèmes de synchronisation et de rafraîchissement graphique de mon dernier message mais j'ai besoin d'éclaircissements : d'ailleurs en fait le vrai problème n'était pas un problème de synchronisation contrairement à ce que je pensais.

Donc j'ai une méthode qui ne doit pas pouvoir s'exécuter plusieurs fois en parallèle, elle s'auto-exclut.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
 
public class TestSynchro 
{
 
	private void maMethodeSynchrone() 
	{
              //cette méthode fait plusieurs chose dont redessiner l'interface graphique
              //elle ne doit pas pouvoir être appelée tant qu'elle est en cours d'exécution
         }
}
Comme elle redessine l'interface j'ai englobé le code de la méthode par SwingUtility

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
 
	private void maMethodeSynchrone() 
	{
		SwingUtilities.invokeLater(new Runnable() 
               { 			
                         public void run()
			{
                        }
                });
         }
J'ai utilisé une variable de classe pour synchroniser
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
 
public class TestSynchro 
{
        boolean verrou = false
	private void maMethodeSynchrone() 
	{
		SwingUtilities.invokeLater(new Runnable() 
               { 			
                         public void run()
			{
                              while(verrou)
                              {
                                     Thread.sleep(200);
                               }
                               verrou = true;
                               .../... traitement
                               verrou = false;
                        }
                });
         }
}
J'ai essayé aussi cette méthode
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
 
public class TestSynchro 
{
        Boolean verrou = false;
        //on veut utiliser synchronized(verrou) donc verrou doit être un objet 
	private void maMethodeSynchrone() 
	{
		SwingUtilities.invokeLater(new Runnable() 
               { 			
                         public void run()
			{
                              synchronized(verrou)
                              {
                               verrou = true;
                               .../... traitement
                               verrou = false;
                               }
                        }
                });
         }
}
J'ai plusieurs questions
1) est-il vraiment nécessaire d'utiliser SwingUtilities ici ? Le revalidate() est en fait appelé en dehors de la méthode, mais il y a plusieurs setSize, setPreferredSize et j'utilise un JScrollPane qui ne semble pas ThreadSecurity ?
2) quelle est la meilleur façon de verrouiller la méthode, la première ou la deuxième ?
3) dans la deuxième, est-il nécessaire de donner une valeur à verrou ?

Merci de vos réponses.