Bonjour,
J'ai un programme qui comporte un thread principal, et un thread qui surveille la valeur d'une variable et execute la commande correspondante.
Mon probleme est que selon la durée de commande, mon thread peut rater des instructions le temps de traiter la précédente.
Un bout de code vaut mieux qu'un long discours :
Le temps d'afficher le message étant variable, je n'ai pas deux fois le meme résultat.
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 namespace Test { class Program { static void Main(string[] args) { DoWork test = new DoWork(); } } class DoWork { private String ActionTodo = "nothing"; Thread ActionThread; bool stopThread = false; //Constructeur public DoWork() { ActionThread = new Thread(ActionLoop); ActionThread.IsBackground = true; ActionThread.Start(); //...ici un tas d'action //puis premiere demande d'action ActionTodo = "coucou"; Thread.Sleep(60); //Tempo de 60 pour etre sur que mon nombre soit traité dans l'ActionLoop //...ici un tas d'action //puis deuxieme demande d'action ActionTodo = "bonjour"; Thread.Sleep(60); //...ici un tas d'action //puis troisieme demande d'action ActionTodo = "youpie"; Thread.Sleep(60); //...ici un tas d'action //puis quatrieme demande d'action qui n'existe pas ActionTodo = "foo"; Thread.Sleep(60); //puis cinquieme demande d'action ActionTodo = "cava"; Thread.Sleep(60); //...ici un tas d'action //puis derniere demande d'action ActionTodo = "byebye"; Thread.Sleep(60); Console.ReadKey(); stopThread = true; } public void ActionLoop() { while (!stopThread) //On tourne tant que l'on arrete pas le programme { Random rand = new Random(); int tempo = 0; //On teste la valeur de ActionTodo switch (ActionTodo) { case "coucou": tempo = rand.Next(200); //temporisation arbitraire simulant un temps de traitement variable... Console.WriteLine("Coucou (" + tempo +"ms)"); Thread.Sleep(tempo); break; case "bonjour": tempo = rand.Next(200); Console.WriteLine("Bonjour(" + tempo + "ms)"); Thread.Sleep(tempo); break; case "youpie": tempo = rand.Next(200); Console.WriteLine("Youpie(" + tempo + "ms)"); Thread.Sleep(tempo); break; case "cava": tempo = rand.Next(200); Console.WriteLine("Ca va ? (" + tempo + "ms)"); Thread.Sleep(tempo); break; case "byebye": tempo = rand.Next(200); Console.WriteLine("Au Revoir(" + tempo + "ms)"); Thread.Sleep(tempo); break; case "nothing": default: break; } //On remet ActionToDo à "nothing" pour éviter de tourner en boucle sur la meme action ActionTodo = "nothing"; Thread.Sleep(50); } } } }
ex :
ouCoucou (192ms)
Ca va ? (92ms)
etc...Coucou (54ms)
Youpie (153ms)
Ma question est donc la suivante :
Comment puis-je me débrouiller pour ne pas rater de commande ?
Ou comment puis-je demander à mon thread principal d'attendre que le thread ActionLoop ai fini sa commande avant d'en lancer une nouvelle ?
Partager