Bonjour,
J'ai une classe Java qui contrôle un affichage d'affiches, il est trop complexe d'expliquer tout le projet mais je vous expose uniquement mon problème : en gros j'ai 2 attributs entiers (qui peuvent prendre comme valeur 1, 2 ou 3) et je dois pouvoir modifier les valeurs de ces 2 attributs au cours du temps de la façon suivante :
Cycle entierUn : 1 (attendre 5secondes) 2 (attendre 15sec) 3 (attendre 40sec) ... et puis le cycle recommence depuis le début.
Cycle entierDeux: 1(attendre 35 secondes) 2 (attendre 20sec) 3 (attendre 5 secondes) ... et puis le cycle recommence depuis le début.
Les deux cylces ont donc une durée totale de 60secondes et commencent en même temps.
Je pensais donc faire de la façon suivante :
Les deux cycles sont lancés par des thread (pour que les deux cycles soient lancés en même temps) dans une méthode principale :
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 .... int un1 = 5, int un2 = 15, int un3 = 40; int deux1 = 35, int deux2 = 20, int deux3 = 5; boolean fonctionne = true; .... public void cycleEntierUn() { while (fonctionne) { entierUn = 1; sleep(un1); entierUn = 2; sleep(un2); entierUn = 3; sleep(un3); } } public void cycleEntierDeux() { while (fonctionne) { entierDeux = 1; sleep(deux1); entierDeux = 2; sleep(deux2); entierDeux = 3; sleep(deux3); } } private void sleep(int sec) { try { Thread.sleep(sec * 1000); } catch (InterruptedException ex) {} } public void modifieUn2() { ... voir plus bas }
Tout fonctionne très bien mis à part qu'en faisant comme ça je n'arrive pas à écrire le code de ma méthode modifieUn2()...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 new Thread(new Runnable() { @Override public void run() { cycleEntierUn(); } }).start(); new Thread(new Runnable() { @Override public void run() { cycleEntierDeux(); } }).start();
En effet cette méthode doit pouvoir remplacer la valeur de l'attribut un2 par 1 (au lieu de 15) uniquement pour un cycle et que le changement soit instantané, donc si au moment ou cette méthode est appelée, on se trouve dans l'exécution de sleep(un2) (détecter qu'on est entrain d'exécuter ce sleep il suffit de vérifier quelle valeur a actuellement entierDeux), le sleep(un2) doit être remplacé durant son exécution par sleep(1) que si le temps restant de sleep(un2) est supérieur à 1... Cela me sembre impossible avec cette manière de procéder... Pourriez-vous m'aider?
Partager