Bonjour à tous,
J'ai conçu un programme qui contient un thread devant mettre à jour l'interface en fonction de son travail. Bref, c'est bizarre parcequ'à chaque fois que je débug (pas à pas), Visual Studio 2005 (SP1) *freeze* pour 10 secondes, ensuite il me permet de jumper à la ligne suivante et ensuite mon thread meurt sans savoir pourquoi.
Alors je me suis dit, pourquoi pas repartir un projet vide et y exécuter le même code au plus simple possible afin de vérifier si ce problème existe. Et c'est le cas !
Visual Studio freeze entre l'exécution ces deux lignes (// *******).
Toutefois, j'ai remarqué que le problème n'existe pas si je ne passe pas *this* en paramètre au Thread.
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 public partial class Form1 : Form { private Thread m_Thread = null; public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { } private static void UpdateFirmware(object param) { Form f = (Form1)param; // ******* // Simple test pour le pas à pas int k = 0; // ******* k = k + 2; } private void button1_Click(object sender, EventArgs e) { m_Thread = new Thread(new ParameterizedThreadStart(UpdateFirmware)); m_Thread.IsBackground = true; m_Thread.Start(this); // ******* } }
Comme par exemple, ce bout de code fonctionne très bien en debug :
Est-ce que j'ai louppé quelque chose ? Je ne comprend pas trop. Je dois bien passé *this* en paramètre si je veux mettre à jour mon interface (avec un BeginInvoke évidemment). J'ai pas trop envie de passer une structure avec tous les contrôles à mettre à jour, ça sera long pour rien. À moins que je n'aie pas le choix.
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 private static void UpdateFirmware(object param) { int k = (int)param; // Simple test pour le pas à pas int k = 0; k = k + 2; } private void button1_Click(object sender, EventArgs e) { m_Thread = new Thread(new ParameterizedThreadStart(UpdateFirmware)); m_Thread.IsBackground = true; m_Thread.Start(4); }
Merci
Partager