Bonjour,
J'ai fait une class pour un petit chronomètre maison.
Cette class utilise un thread et la class main lance celle-ci.
Mon but est de pouvoir mettre à jour dans une interface graphique (bien que pour l'instant je fais tout dans la console pour les testes) le chonomètre au dixième de milliseconde près.
Le problème est que l'affichage (dans la console) du chronomètre ne se met à jour que toutes les 5 secondes.
Voici le main :
Et la class du chronomètre même :
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 import java.util.ArrayList; public class main { /** * @param args */ public static void main(String[] args) { StopWatch sw = new StopWatch(); sw.startSP(); ArrayList time = new ArrayList(); while(true){ if(sw.getTime() == null){ System.out.println(time.get(2)+":"+time.get(1)+":"+time.get(0)); }else{ time.clear(); time.addAll(sw.getTime()); System.out.println(time.get(2)+":"+time.get(1)+":"+time.get(0)); } } } }
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116 import java.util.ArrayList; import java.util.List; public class StopWatch { private long startTime = 0; private long stopTime = 0; private boolean running = false; private boolean loop = true; private boolean authorizeGet = true; private Thread t; private final ArrayList time = new ArrayList(); public StopWatch(){ /* init the variables */ this.time.add(0); this.time.add(0); this.time.add(0); this.t = new Thread(new swThread()); } public void startSP(){ this.t.start(); } public void stopSP(){ this.loop = false; } private void startMS() { this.startTime = System.currentTimeMillis(); this.running = true; } private void stopMS() { this.stopTime = System.currentTimeMillis(); this.running = false; } private long getElapsedTime() { long elapsed; if (running) { elapsed = (System.currentTimeMillis() - startTime); } else { elapsed = (stopTime - startTime); } return elapsed; } public synchronized ArrayList getTime(){ if(authorizeGet){ return this.time; }else{ return null; } } private synchronized void setTime(ArrayList time){ this.time.clear(); this.time.addAll(time); } public class swThread implements Runnable{ @Override public void run() { /* start the MS */ startMS(); long min = 0; long sec = 0; long ms = 0; while(loop){ ms = getElapsedTime(); if(ms >= 999){ sec++; ms = 0; /* stop the MS */ stopMS(); if(sec == 60){ min++; sec = 0; } /* start the MS */ startMS(); } /* get the first 2 digits */ String strMs = ((String)(""+ms)); if(strMs.length() >= 2){ strMs = strMs.substring(0, 2); }else{ strMs = strMs.substring(0, 1); } /* create a temp time */ ArrayList time = new ArrayList(); time.add(strMs); time.add(sec); time.add(min); /* block the get function to prevent accessing errors */ authorizeGet = false; /* set the time */ setTime(time); /* unblock */ authorizeGet = true; } } } }
Comme vous pouvez le voire je trafique un peu pour ne pas avoir de problème d'accès a la variable time tout en essayant de garder le chronomètre à jour, mais cela ne fonctionne pas.
Que me conseillez-vous ?
Cordialement,
rXp>!<
Partager