スレッド終了、GetExitCodeThread後終了値ずっとSTILL_ACTIVE,259の質問
最近はVC++で視覚検出システムを記述しており,その中で開いているスレッドが比較的多い.スレッドがいつ終わるかを知ることが重要な問題です.GetExitCodeThread()関数が使用されます.関数のプロトタイプは次のとおりです.
ここで、hThreadは、表示するスレッドのハンドルを表し、lpExitCodeは関数呼び出し時に渡されてスレッド状態を保存するDWORDタイプのポインタである.値がSTILL_未満の場合ACTIVEはスレッドが終了していないことを示す.この関数の戻り値は,スレッドの状態とは何の関係もない.関数が正常に実行されたかどうかを示すだけです.この関数を再使用するときに問題が発生し、スレッドは終了しました.スレッドにループがあるかどうかを確認できます.ループはもう実行されていません.しかしこの関数で得られた状態コードはずっとSTILL_ACTIVEは、実際にコンパイラで見たときは259、16進数に変換するとSTILL_ACTIVE.コードは次のとおりです.
ずっとどのように解决することを知らないで、それから一回の偶然の机会は更にGetExitCodeThread関数の前に先に、dwExitCodeを初期化して、正常になりました.コードは次のとおりです.
具体的な理由は不明ですが、この関数の内部でlpExitCodeに値を割り当てるときは単純な直接値ではない可能性があります.STILL_ACTIVEの値は(((DWORD)0 x 0000103 L)であり、DWORDは実際にはunsigned charである.STILL_ACTIVEの値は実際には16進数です.10進数に変換すると259です.ここではlpExitCode付与は簡単な*lpExitCode=xxなどではないかもしれません.したがってGetExitCodeを実行するたびに*lpExitCodeの値を再初期化する必要があるでしょう.
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)0 x 0000103 L)であり、DWORDは実際にはunsigned charである.STILL_ACTIVEの値は実際には16進数です.10進数に変換すると259です.ここではlpExitCode付与は簡単な*lpExitCode=xxなどではないかもしれません.したがってGetExitCodeを実行するたびに*lpExitCodeの値を再初期化する必要があるでしょう.