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;
}