hello,
je suis bloqué sur l'utilisation du mot clé synchronized... en fait je ne comprend pas comment utiliser les blocs synchronisés...
je vais essayer d'expliquer ma situation le plus clairement possible.
j'ai une classe qui implémente Runnable. La méthode run() s'occupe de mettre à jour différents JPanel en fonction de l'état d'un objet (en fait je dessine dans des JPanel selon l'état d'un chronomètre)
Cependant, une autre méthode de la classe permet d'activer / de désactiver certains JPanel (elle fait un removeAll() puis reconstruit seulement ceux nécessaires)... et donc si le thread exécutant la méthode run() se trouve arrêté au milieu d'une mise à jour, puis qu'ensuite le JPanel sur lequel il était en train de travailler est détruit et n'existe plus, cela me fait des NullPointerException et ensuite plus rien ne fonctionne...
Je met le code (allégé) des deux méthodes en cause
méthode run()
méthode qui active / détruit certains JPanel
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
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48 public void run() { interrupted = false; while (!interrupted) { byte lesHeures = CHRONO.getHeures(); byte lesMinutes = CHRONO.getMinutes(); byte lesSecondes = CHRONO.getSecondes(); int lesMillis = CHRONO.getMillis(); if ((h != null) && withHours) { synchronized (h) { h[0].setValue((byte) (lesHeures / 10)); h[1].setValue((byte) (lesHeures % 10)); } } if ((min != null) && withMin) { synchronized (min) { min[0].setValue((byte) (lesMinutes / 10)); min[1].setValue((byte) (lesMinutes % 10)); } } if ((sec != null) && withSec) { synchronized (sec) { sec[0].setValue((byte) (lesSecondes / 10)); sec[1].setValue((byte) (lesSecondes % 10)); } } if ((ms != null) && withMS) { synchronized (ms) { ms[0].setValue((byte) (lesMillis / 100)); byte temp = (byte) (lesMillis % 100); ms[1].setValue((byte) (temp / 10)); ms[2].setValue((byte) (temp % 10)); } } try { Thread.sleep(1000 / FPS); } catch (InterruptedException e) { e.printStackTrace(); } } }
Si quelqu'un pouvait me dire comment dispatcher mes blocs synchronisés pour éviter les NullPointer (bon je sais qu'on pourrait utiliser des try/catch mais je voudrais vraiment comprendre le synchronized )
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
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47 public void recreerLesDigits() { removeAll(); h = null; min = null; sec = null; ms = null; if (withHours) { h = new Digit[2]; for (int i = 0; i < h.length; i++) { h[i] = new Digit(); h[i].setLargeurSeg(largGrSeg); //etc } } if (withMin) { min = new Digit[2]; for (int i = 0; i < min.length; i++) { min[i] = new Digit(); min[i].setLargeurSeg(largGrSeg); //etc } memo += ((2 * longuGrSeg) + (6 * largGrSeg)); nGroupes++; } if (withSec) { sec = new Digit[2]; for (int i = 0; i < sec.length; i++) { sec[i] = new Digit(); sec[i].setLargeurSeg(largGrSeg); // etc } } if (withMS) { ms = new Digit[3]; for (int i = 0; i < ms.length; i++) { ms[i] = new Digit(); ms[i].setLargeurSeg(largPeSeg); //etc } } }
Et si ça intéresse quelqu'un je peux mettre en ligne un zip avec le fichier projet Eclipse 3.0 et toutes les sources (si vous avez envie de pouvoir tester en "live")
Merci de votre aide !
Partager