- ベストアンサー
WaitForSinbleObjectについて
こんにちは。 現在VC++6.0でスレッドを用いたプログラムを行っています。 GUIでSTARTボタンを押すと、ワーカースレッドが起動し特定量の処理を開始します。(例えば100件のファイルコピーなど) 100件の処理が完了したらワーカースレッドは終了する。 GUIでSTOPボタンを押したときにフラグを立てて、ワーカースレッド内でそのフラグが立っていたら処理を抜けてスレッドを終了させることもできるようにしたいと考えています。 このワーカースレッドの終了のことで疑問があります。 STOPボタンを押してフラグを立てたあとにWaitForSingleObjectでスレッドの終了を待とうと思っていますが、このSTOPボタンを押したタイミングと、100件のファイルコピーが終わりワーカースレッドが自分で終了するタイミングとがかぶってしまった場合、WaitForSingleObjectで待ちに入った時点で、すでにスレッドが終了してしまっている場合が起こりうるのではないかと考えているのですが、実際にどうなのでしょうか? WaitForSingleObject実行時にすでにスレッドが破棄されていた場合、WaitForSingleObjectはどういう値を返すのでしょうか? 事前にスレッド(スレッドのハンドル)が生きているかどうかを調べる方法はあるのでしょうか? ご存知の方教えてください。 わかりづらい説明で申し訳ありません。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
(1) 事前にスレッドが破棄されているかどうかを調べるには GetExitCodeThread() 関数を使います。 BOOL GetExitCodeThread( HANDLE hThread, LPDWORD lpExitCode ); hThread :対象のスレッドハンドル lpExitCode:終了コードを受け取る DWORD 型へのポインタ 正常終了のときは 0 以外 異常終了のときは 0 が返ります。 戻り値は、スレッドが破棄されているときはtrue、 破棄されて無いときはfalseを返却します。 <参考URL> http://wisdom.sakura.ne.jp/system/winapi/win32/win143.html (2) WaitForSingleObjectについては以下のURLを参照ください。 http://msdn.microsoft.com/ja-jp/library/cc429427.aspx GUIでスレッドの待機を行うには WaitForSingleObject 関数 ではなく、MsgWaitForMultipleObjects または MsgWaitForMultipleObjectsEx 関数 を使う指示が書かれてます。 これらについての関数仕様は以下のURLを参照ください。 ・MsgWaitForMultipleObjects 関数 http://msdn.microsoft.com/ja-jp/library/cc429261.aspx ・MsgWaitForMultipleObjectsEx 関数 http://msdn.microsoft.com/ja-jp/library/cc429263.aspx
その他の回答 (1)
- gentoo314
- ベストアンサー率41% (15/36)
CreateThread() か、_beginthreadex()でスレッドを起動すると、スレッドハンドルが返り、明示的にCloseHandle()をコールする必要があります。スレッドがどのような状態でも、WaitForSingleObject()は有効です。スレッドが死んでいれば 0, 生きていればタイムアウトが返ります。下はスレッドが死ぬまで待つ例です。 Handle hThread = (HANDLE)_beginthread(...); WaitForSingleObject( hThread, INFINITE ); CloseHandle( hThread ); という具合です。
お礼
すいません。私の説明不足でした。 スレッドの起動はAfxBeginThread()で行っています。 回答ありがとうございました。
お礼
参考URLまでつけていただきありがとうございました。 GetExitCodeThreadで希望通りの動きをさせることができました。 アドバイスありがとうございました。