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 (// *******).

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); // *******
    }
}
Toutefois, j'ai remarqué que le problème n'existe pas si je ne passe pas *this* en paramètre au Thread.

Comme par exemple, ce bout de code fonctionne très bien en debug :

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);
}
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.

Merci