2012-03-01 14 views
0

どのようにですか?C++ thread alive?

私は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

+0

いいえ、WaitForSingleObjectは決して値を返しません。 – CSharpRU

+1

はい、信頼できます。私は多くのプロジェクトでこれを使用しています。 – Damon

答えて

1

スレッドが強制的に強制終了された場合タスクマネージャまたはプロセスエクスプローラから、スレッドIDは変更されません。スレッドハンドルは、プロセスがまだ閉じていないために存在します。そのスレッドに関連付けられているスレッドIDはまだ存在します。したがって、GetThreadIdは常にゼロ以外の値を返します。

終了コードは、スレッドが終了しなかったため、終了コードに意味のある値を取得できません。それは殺された。終了コードを設定する機会はありませんでした。

あなたがしなければならないことは、待機機能の1つを使用することです。 WaitForSingleObject、あなたのスレッドハンドルを待つ。スレッドが強制終了されたためにその待機が終了すると、wait関数は戻り、成功したと報告し、スレッド終了コードは0と報告されます。私の知る限りでは、あなたのスレッドが異常に殺されたことをWindows APIによって識別することはできません。

あなたのできることは、独自のメカニズムを使用して異常終了を示すことです。スレッドが所有するフラグを作成して、正常終了を記録します。スレッドが実行を開始すると、フラグをfalseに設定します。スレッドが正常に終了すると、フラグをtrueに設定します。この方法で、スレッドが終了した後にそのフラグの値を読み取ることによって、スレッドが異常終了したかどうかを知ることができます。

+0

例がありますか? – CSharpRU

+0

ブール値フラグの例?確かにそれを解決することができます。スレッドを作成する前に、スレッドprocの開始時にfalseに設定するか、それ以上に設定してください。次に、スレッドprocが終了する直前にtrueに設定します。 –

+0

スレッドのステータスはどうやって取得できますか?それがいつも偽であれば、それはいつ死ぬのか分かりません。 – CSharpRU

0

から終了コードまたはゼロの値を取得することはできません。

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

質問をもう一度お読みください。 – CSharpRU