2010-03-22 83 views
1

Supose你有啓動按鈕形式/停止線程(不暫停或中斷,我真的需要停止線程!) 看看這個代碼:C#CF重新啓動一個線程

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個問題(記得CF): - 我如何知道線程是否正在運行(我似乎無法訪問m_pThreadState,並且我試過C++ GetThreadExitCode(),它會給出錯誤結果)? - 最重要的問題:如果我已經停止線程,我無法重新啓動它,很可能是因爲m_TestThread.m_fStarted仍然被設置(並且它是私人的,所以我無法訪問它)!因此,m_TestThread.Start()會生成一個異常(StateException)。

用Abort()停止線程並不能解決問題。如果我把我的m_TestThread = null;它的工作原理,但後來我創建了一個內存泄漏。 GC也不會清理,即使我等待了xx秒。

有人有想法嗎?所有幫助高度讚賞! Grtz E

回答

1

您可以使用Thread.SuspendThread.Resume停止/重新啓動線程。您可以使用Thread.ThreadState來檢查線程的狀態。

+0

請參閱暫停和恢復字幕:「注意:此API現在已過時。」 – 2010-03-24 17:36:11

+0

THX所有的反饋。不幸的是,CF中不支持ThreadState(http://msdn.microsoft.com/en-us/library/system.threading.thread_members.aspx)。我會堅持布爾值,但我覺得這是一個非常尷尬的方式來處理(但也許這只是我) – 2010-03-29 07:38:44