Bonjour,
Actuellement en train de découvrir les threads, j'ai décidé de revoir mon application avec l'utilisation des threads avant d'avancer trop loin dans le projet, seulement je rencontre beaucoup de problème (en faite à chaque modification de mon code j'ai un problème...)
Cette fois ci, ce sont mes threads qui lance un timer "maison" qui se mélange, du moins je pense car à débugger c'est pas simple du tout.
Il y a pour l'instant dans mon code 2 thread "enfant" en plus du thread d'origine.
Alors voici le code d'un bouton qui démarre 1 thread:
Le thread va donc lancer cette méthode:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 private void Timer1_Click(object sender, EventArgs e) { AiIMP++; tabIMP[AiIMP] = "iram010" + AiIMP; Thread t1 = new Thread(new ParameterizedThreadStart(obj => { lancementTimer(e); })); t1.Start(); }
Dans cette méthode, les deux Invoke font référence à :
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 public void lancementTimer(EventArgs e) { int i = 0; int idthread = ++id; while (true) { i++; Invoke((vider)viderTB); Invoke((montrerSpool)ajoutTB, "Timer vaut " + i + ". Thread N° " + idthread); //lectureSpooler(nomIMP); if (i == 10000) { i = 0; } Thread.Sleep(500); } }
Et:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 public void ajoutTB(string valeur) { lock (_lock) { int i; for (i = 0; i < 5; i++) { if (tabIMP[i] == "iram0101") { textBox1.Text += (valeur) + Environment.NewLine; } if (tabIMP[i] == "iram0102") { textBox2.Text += (valeur) + Environment.NewLine; } if (nomIMP == "iram0103") { textBox3.Text += (valeur) + Environment.NewLine; } if (nomIMP == "iram0104") { textBox4.Text += (valeur) + Environment.NewLine; } } } }
Lorsque je clique sur mon bouton qui démarre la méthode "Timer1_Click", aucun problème, tout ce déroule très bien mais lorsque que je veux ajouter un second thread en plus du premier, tout se mélange, le premier thread apparait dans les deux textBox ainsi que le deuxième.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 public void viderTB() { int i; for (i = 0; i < 5; i++) { if (tabIMP[i] == "iram0101") { textBox1.Clear(); } if (tabIMP[i] == "iram0102") { textBox2.Clear(); } if (nomIMP == "iram0103") { textBox3.Clear(); } if (nomIMP == "iram0104") { textBox4.Clear(); } } }
Je vous donne le code du deuxième thread:
Identique au premier donc, seul la méthode lancé par ce thread est différent afin qu'il est un timer différent chacun.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 private void Timer2_Click(object sender, EventArgs e) { AiIMP++; tabIMP[AiIMP] = "iram010" + AiIMP; Thread t2 = new Thread(new ParameterizedThreadStart(obj => { lancementTimer2(e); })); t2.Start(); }
J'en conclu donc qu'il doit y avoir un problème lors que l'affichige, j'ai essayé de mettre un lock dans la méthode "ajoutTB" mais rien ne change.
Je pense que je n'ai pas encore tout à fait compris le concept des threads mais la je suis complétement dans l'impasse, quelqu'un aurait il une solution et une explication à me donner?
Partager