前章では、子スレッドの終了をGetExitCodeThread関数で調べてSTILL_ACTIVEを返している間は、待機していました。しかし、本来は待機関数を使うべきです。
ここでは、最も簡単な待機のプログラムを作ってみましょう。
DWORD WaitForSingleObject( HANDLE hHandle, // オブジェクトのハンドル DWORD dwMilliseconds // タイムアウト時間 );hHandleには、オブジェクトのハンドルを指定します。
dwMillisecondsには、タイムアウト時間を指定します。
これに、INFINITEを指定するとオブジェクトがシグナル状態になるまで待機します。
CreateThread関数はスレッドハンドルを返すので、これを第1引数に指定し、第2引数をINFINITEにすると、スレッドが終了するまで、この関数は待機します。
/* mult03.c */
#include <stdio.h>
#include <windows.h>
#include <process.h>
unsigned __stdcall mythread(void *);
int main()
{
int i;
HANDLE hTh;
DWORD thID;
hTh = (HANDLE)_beginthreadex(NULL, 0, mythread, NULL, 0, &thID);
if (hTh == 0) {
printf("スレッド作成失敗\n");
return -1;
}
for (i = 0; i < 10; i++)
printf("Main [%d]\n", i);
WaitForSingleObject(hTh, INFINITE);
CloseHandle(hTh);
return 0;
}
unsigned __stdcall mythread(void *lpx)
{
int i;
for (i = 0; i < 20; i++)
printf("子スレッド[%d]\n", i);
printf("子スレッド終了!\n");
return 0;
}
main関数のWaitForSingleObject関数で、子スレッドが終了するまで待機します。
シグナル状態になるとreturnして、main関数が終了します。
子スレッドが終了するまで、親は待機している様子がわかります。
Update May/11/2004 By Y.Kumei