如果想註冊一個工作項,等待一個內核對象被觸發的時候去執行,與之前說過的步驟很相似,首先編寫如下原型的函數:
VOID CALLBACK KernelObjCallback(
PTP_CALLBACK_INSTANCE pInstance,
PVOID pvContext,
PTP_WAIT pWait,
TP_WAIT_RESULT WaitResult );
pWait是CreateThreadpoolWait函數返回的對象,WaitResult是DWORD的值,可能的值是WAIT_OBJECT_0,WAIT_TIMEOUT,WAIT_ABANDONED_0折三種類型。
調用CreateThreadpoolWait創建一個線程池等待對象,
VOID CreateThreadpoolWait(
PTP_WAIT_CALLBACK pfnWaitCallback,
PVOID pvContext,
PTP_CALLBACK_ENVIRON pcbe);
創建完成之後,調用下面的函數將內核對象綁定到這個線程池,
VOID SetThreadpoolWait(
PTP_WAIT pWaitItem,
HANDLE hObject,
PFILETIME pftTimeout
)
hObject是指定的內核對象,需要等該內核對象觸發,pfnWaitCallback所指向的函數才能執行。
pftTimeout用來表示線程池最長花多少時間來等待內核對象被觸發,傳0表示不用等待,傳負值表示相對時間,傳NULL表示無限等待,類似WaitForSingleObject的INFINITE。
下面是代碼demo:
//內核對象觸發調用函數
HANDLE g_hEvent_2;
VOID CALLBACK KernelObjCallback(
PTP_CALLBACK_INSTANCE pInstance,
PVOID pvContext,
PTP_WAIT pWait,
TP_WAIT_RESULT WaitResult )
{
_tprintf(_T("KernelObjCallback is called, WaitResult=%u\n"), WaitResult);
}
//end
int _tmain( int argc, TCHAR* argv[] )
{
//內核對象觸發時調用一個函數
g_hEvent_2 = CreateEvent(NULL, TRUE, FALSE, NULL);
PTP_WAIT pWait = CreateThreadpoolWait(KernelObjCallback, NULL, NULL);
if ( NULL == pWait)
{
_tprintf(_T("Impossible to create the pWait:%u\n"), GetLastError());
return -1;
}
SetThreadpoolWait(pWait, g_hEvent_2, NULL);
int nLoopTimes = 0;
while (nLoopTimes < 10)
{
_tprintf(_T("The %d loop.\n"), nLoopTimes);
nLoopTimes++;
}
SetEvent(g_hEvent_2);//用來觸發內核對象
WaitForThreadpoolWaitCallbacks(pWait, FALSE);
CloseHandle(g_hEvent_2);
CloseThreadpoolWait(pWait);
//end
return 0 ;
}
運行結果如下: