執行緒結束,GetExitCodeThread後結束值一直STILL_ACTIVE,259的問題

NO IMAGE
1 Star2 Stars3 Stars4 Stars5 Stars 給文章打分!
Loading...

最近在用VC 編寫一個視覺檢測系統,其中開的執行緒比較多。知道執行緒什麼時候結束是很重要的一個問題。其中用到了GetExitCodeThread()函式。函式原型如下:

   BOOL   GetExitCodeThread (
HANDLE         hThread,
LPDWORD      lpExitCode
);

其中,hThread,表示要檢視的執行緒的控制代碼,lpExitCode是一個DWORD型別的指標,該指標是呼叫函式時傳遞進去以儲存執行緒狀態的。如果值未STILL_ACTIVE則表示執行緒未結束。
這個函式的返回值,和執行緒的狀態沒有任何關係。只是表示該函式是否執行成功;
我再使用該函式的時候遇到一個問題,執行緒已經結束了。我能確定執行緒裡面有個迴圈,還迴圈已經不在執行了。但是用該函式獲得的狀態碼一直是STILL_ACTIVE,實際上在編譯器裡面看的時候是259,轉換成16進位制就是STILL_ACTIVE。程式碼如下:

if ( m_pThreadVelocity )
{
DWORD dwExitCode = 0;
do
{
GetExitCodeThread(m_pThreadVelocity->m_hThread, &dwExitCode);
}
while( STILL_ACTIVE == dwExitCode );
m_pThreadVelocity = NULL;
}
m_pThreadVelocity = AfxBeginThread(fnVelocityAndMeterThread, &m_VelocityAndMeterThreadParam, THREAD_PRIORITY_TIME_CRITICAL);

一直不知道怎麼解決,後來一次偶然的機會再GetExitCodeThread函式之前先把,dwExitCode初始化了一下,就變正常了。程式碼如下:

if ( m_pThreadVelocity )
{
DWORD dwExitCode = 0;
do
{
dwExitCode = 0;
GetExitCodeThread(m_pThreadVelocity->m_hThread, &dwExitCode);
}
while( STILL_ACTIVE == dwExitCode );
m_pThreadVelocity = NULL;
}
m_pThreadVelocity = AfxBeginThread(fnVelocityAndMeterThread, &m_VelocityAndMeterThreadParam, THREAD_PRIORITY_TIME_CRITICAL);
}

現在還不知道具體什麼原因,可能是該函式內部給 lpExitCode賦值的時候不是簡單的直接賦值。STILL_ACTIVE的值是一個((DWORD )0x00000103L) ,DWORD實際是unsigned char。STILL_ACTIVE的值實際上是16進位制的。轉化成10進位制就是259。這裡可能lpExitCode賦值不是簡單的*lpExitCode = xx之類的。所以每次執行完GetExitCode後需要重新初始化*lpExitCode的值吧。

相關文章

程式語言 最新文章