Cross Thread et modification de variable
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 :
Code:
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);
}
}
}
} |
Le temps d'afficher le message étant variable, je n'ai pas deux fois le meme résultat.
ex :
Citation:
Coucou (192ms)
Ca va ? (92ms)
ou
Citation:
Coucou (54ms)
Youpie (153ms)
etc...
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 ?