Win32API ユーザーモード非同期プロシージャ呼び出し QueueUserAPC, SleepEx

QueueUserAPC
ユーザーモード非同期プロシージャ呼び出し(APC)オブジェクトを、
指定したスレッドの APC キューに追加します。

 DWORD QueueUserAPC(
  PAPCFUNC pfnAPC, // APC 関数へのポインタ
  HANDLE hThread,  // スレッドのハンドル
  DWORD dwData     // APC 関数の引数
);


パラメータ

pfnAPC
指定したスレッドがアラート可能な待機動作を実行するときに呼び出す
アプリケーション定義 APC 関数へのポインタを指定します。

hThread
スレッドのハンドルを指定します。このハンドルには 
THREAD_SET_CONTEXT アクセス権が必要です。

dwData
pfnAPC が指す APC 関数に渡す DWORD 引数を指定します。
これが APC 関数の唯一の引数となります。


参照:http://msdn.microsoft.com/ja-jp/library/cc429304.aspx
//ユーザーモード非同期プロシージャ呼び出し(APC)を
//用いたサンプルプログラム


#include <windows.h>
#include <process.h>

void WINAPI APCFunc(ULONG_PTR arg)
{
	printf("APCFunc is called\n");
}

UINT WINAPI ThreadFunc(LPVOID arg)
{
	printf("SleeEx\n");

        //SleepExの第2引数をTRUEに設定してアラート可能な待機状態にする。
	//main関数のQueueUserAPCが呼び出されるとSleepExから制御が返る。
	SleepEx(INFINITE, TRUE);

	printf("Returned from SleeEx\n");
	return 0;
}

int main()
{
	HANDLE hThread;
	UINT uiThreadId;

	//スレッド起動
	hThread = (HANDLE)_beginthreadex(NULL,
		0,
		ThreadFunc,
		NULL,
		0,
		&uiThreadId);

        //QueueUserAPCの効果を確かめるために少し待つ
        //(SleepExでスレッド関数を停止させておく)
	Sleep(2000);

	//ユーザーモード非同期プロシージャ呼び出し(APC)
	//オブジェクトを、指定したスレッドの APC キューに追加する
	QueueUserAPC(APCFunc, hThread, 0);

	//スレッドの終了を待機する
	WaitForSingleObject(hThread, INFINITE);

	//スレッドのハンドルを閉じる
	CloseHandle(hThread);

	return 0;
}