2010-03-22 5 views
1

Supose vous avez un formulaire avec un bouton qui commence/arrête un fil (pas une pause ou d'interrompre, je vraiment besoin d'arrêter le fil!) Commander ce code:C# CF Redémarrez un fil

Constructor() 
{ 
    m_TestThread = new Thread(new ThreadStart(ButtonsThread)); 
    m_bStopThread = false; 
} 

ButtonClick 
{ 
    // If the thread is not running, start it 
    m_TestThread.Start(); 
    // If the thread is running, stop it 
    m_bStopThread = true; 
    m_TestThread.Join(); 
} 

ThreadFunction() 
{ 
    while(!m_bStopThread) 
    { 
    // Do work 
    } 
} 

2 questions (rappelez-vous CF): - Comment puis-je savoir si le thread est en cours d'exécution (je n'arrive pas à accéder au m_pThreadState, et j'ai essayé le GetThreadExitCode() C++, il donne des résultats faux)? - Question la plus importante: si j'ai arrêté le thread, je ne peux pas le redémarrer, très probablement parce que le m_TestThread.m_fStarted est encore défini (et il est privé donc je ne peux pas y accéder)! Et donc m_TestThread.Start() génère une exception (StateException).

L'arrêt du thread avec Abort() ne le résout pas. Si je mets mon m_TestThread = null; ça marche, mais ensuite je crée une fuite de mémoire. Le GC ne nettoie pas non plus, même si j'attends xx secondes.

Quelqu'un a une idée? Toute aide très appréciée! Grtz E

Répondre

1

Vous pouvez utiliser Thread.Suspend et Thread.Resume pour arrêter/redémarrer le fil.

Pour vérifier l'état du fil, vous pouvez utiliser Thread.ThreadState.

+0

Voir les sous-titres pour Suspend et Resume: "NOTE: Cette API est maintenant obsolète." –

+0

THX tous pour les commentaires. Malheureusement, ThreadState n'est pas pris en charge dans les FC (http://msdn.microsoft.com/fr-fr/library/system.threading.thread_members.aspx). Je vais m'en tenir au booléen, mais je trouve que c'est une façon très maladroite de gérer (mais peut-être que c'est juste moi) –