2012-03-01 92 views
0

如何?C++線程還活着嗎?

我試過一個WaitingForSingleObject,GetExitCodeThread等,但是當我用進程資源管理器終止線程時什麼都沒有發生。

while(true) 
{ 
    if(GetThreadId(this->hWatchThread) == 0) // Always return killed thread id! 
     break; 
} 

UPD: 當我殺死線程,它停止工作,但如果你想線程退出後做一些我無法得到退出代碼或GetThreadId

+1

可能重複[如何確定如果Win32線程已終止?](http://stackoverflow.com/questions/301054/how-can-i-determine-if-a-win32-thread-has-終止) – Jon 2012-03-01 09:39:19

+0

不,WaitForSingleObject永遠不會返回值。 – CSharpRU 2012-03-01 09:54:14

+1

是的,它可靠。我在很多項目中使用它。 – Damon 2012-03-01 10:15:52

回答

1

當一個線程被強行中止時,例如從任務管理器或Process Explorer中,不會更改線程ID。線程句柄仍然存在,因爲您的進程尚未關閉它。與該線程關聯的線程ID仍然存在。所以GetThreadId將總是返回一個非零值。

至於退出代碼,由於線程沒有退出,所以無法獲得退出代碼的有意義的值。它被殺害了。它從來沒有機會設置退出代碼。

你必須做的是使用其中一個等待功能,例如, WaitForSingleObject,等待你的線程句柄。如果該等待由於線程被終止而終止,則等待函數將返回並報告成功的等待,並且線程退出代碼將被報告爲0。就我所知,您無法通過Windows API識別您的線程是否被異常終止。

你可以做的是使用你自己的機制來表明終止異常。創建一個由該線程擁有的標誌來記錄終止是否正常。線程開始執行時將該標誌設置爲false。當線程正常終止時,將該標誌設置爲true。通過這種方式,可以通過在線程終止後讀取該標誌的值來判斷線程是否異常終止。

+0

你能舉個例子嗎? – CSharpRU 2012-03-01 12:32:54

+0

布爾標誌的例子?你當然可以解決這個問題。在創建線程之前,在線程處理的開始時將其設置爲false,或者甚至更好。然後在線程proc退出之前將其設置爲true。 – 2012-03-01 12:44:59

+0

我如何獲得線程狀態?如果它總是假的,我不知道它何時死亡。 – CSharpRU 2012-03-01 13:37:06

0

零值:

WaitForSingleObject(handle_to_your_thread,INFINITE); 
MessageBox(NULL,"Thread has exited","Foo",MB_ICONINFORMATION); 
+0

請再次閱讀問題。 – CSharpRU 2012-03-01 10:15:26