今回も前回やったものとみたような感じのことをしますが、
違う点は今回の関数はスレッド専用関数で、スレッドの状態をアクティヴに取得するものです。
2種類のスレッドは相変わらずインクリメントしているだけなので割愛します。
// 終了要求が出された
case WM_CLOSE :
//スレッド1が終了するまで終わらない
GetExitCodeThread(hThread1 , &dThreadID1);
if(dThreadID1==STILL_ACTIVE)
return 0 ;
//スレッド2が終了するまでループ
GetExitCodeThread(hThread2 , &dThreadID2);
if(dThreadID2==STILL_ACTIVE)
return 0 ;
//スレッドオブジェクトのハンドルを閉じる
CloseHandle(hThread1);
CloseHandle(hThread2);
//デバイスコンテクスト解放
ReleaseDC(hwnd,g_hdc);
break ;
さて、ウィンドウプロシージャでウィンドウを閉じる要求が出されたときに
GetExitCodeThread 関数にスレッドのハンドルを指定して、そのスレッドの状態を得ています。
スレッドの状態は第二引数に格納されるので、その値を調べます。
その時の値が STILL_ACTIVE(まだ生きている) なら終了しません。
2つのスレッドが終了したならハンドルを閉じ、DefWindowProc で終了します。
では以上を踏まえたソースを実行してみましょう。
終了しようとしても、両方の値が「END」になるまでは終了しません。
■BOOL GetExitCodeThread( HANDLE hThread, LPDWORD lpExitCode );
・指定されたスレッドの終了ステータスを取得します
第一引数 hThread には、スレッドのハンドルを指定します (in)
第二引数 lpExitCode には、1個の変数へのポインタを指定します・ (out)
lpExitCodeに格納されるパラメータ(終了ステータス)
STILL_ACTIVE・・・・指定したスレッドが終了していない
他・・・・・・・・・・・・・・ スレッドが既に終了した
戻り値 成功ならTRUE(0以外の値) が、失敗ならFALSE(0) が返ります。
■ソースの表示■
2005/7/9