最近在用VC++編寫一個視覺檢測系統,其中開的線程比較多。知道線程何時結束是很重要的一個問題。其中用到了GetExitCodeThread()函數。函數原型以下:python
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的值吧。指針