 前章では、子スレッドの終了をGetExitCodeThread関数で調べてSTILL_ACTIVEを返している間は、待機していました。
前章では、子スレッドの終了を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