Win32API ワーカースレッドを使う QueueUserWorkItem

QueueUserWorkItem
内のワーカースレッドのキューに作業項目を入れます。

 BOOL QueueUserWorkItem(
  LPTHREAD_START_ROUTINE Function,
  PVOID Context,
  ULONG Flags
);


パラメータ

Function
内のスレッドによって実行する LPTHREAD_START_ROUTINE 型
アプリケーション定義関数へのポインタを指定します。
この値は、スレッドの開始アドレスを表します。
詳細については、ThreadProc を参照してください。

Context
スレッド関数に渡す唯一の 32 ビットパラメータ値を
指定します。

Flags
フラグ


Flagsに設定する定数

WT_EXECUTEDEFAULT既定値で、コールバック関数を非 I/O ワーカースレッドのキューに入れます。
WT_EXECUTEINIOTHREADコールバック関数を I/O ワーカースレッドのキューに入れます。未処理の非同期 I/O 要求があると存在しないスレッドで関数を実行するときは、このフラグをセットしてください。
コールバック関数は APC としてキューに入ります。関数がアラート可能待機操作を実行するときは、再入の問題に必ず対処してください。
WT_EXECUTEINPERSISTENTIOTHREAD終了することのないスレッドのキューにコールバック関数を入れます。
現在、ワーカースレッドで永続的なものはありません。ただし、未処理の I/O 要求があると、ワーカースレッドは終了しません。
WT_EXECUTELONGFUNCTIONコールバック関数が長い待機を実行できるようにします。このフラグは、システムが新しいスレッドを作成するかどうか判断するのを助けます。このフラグをセットする場合は、WT_EXECUTEINIOTHREAD フラグも必ずセットしてください。

参照:http://msdn.microsoft.com/ja-jp/library/cc429306.aspx


#include <windows.h>

HANDLE g_hEvent;

//スレッド関数
DWORD WINAPI ThreadFunc(LPVOID arg)
{
	int i;
	for (i = 0; i < 20; i++) {
		printf("%d, ThreadId = %u\n", 
			i, GetCurrentThreadId());
		
		Sleep(100);
	}

	//Eventで関数が終了したことを呼び出し元に通知する
	SetEvent(g_hEvent);

	puts("SetEvent");

	return 0;
}


int main()
{
	g_hEvent = CreateEvent(NULL, TRUE, FALSE, "Event");
	if (g_hEvent == NULL) {
		return 1;
	}

	//ワーカースレッドのキューに関数ポインタを渡し、
        //スレッド関数を実行する
	QueueUserWorkItem(ThreadFunc, NULL, WT_EXECUTEDEFAULT);

	//スレッド関数内でSetEventが呼び出されるのを待機する
	WaitForSingleObject(g_hEvent, INFINITE);

	puts("Exit main");

	return 0;
}