Windows核心編程--線程池內核對象觸發調用函數

如果想註冊一個工作項,等待一個內核對象被觸發的時候去執行,與之前說過的步驟很相似,首先編寫如下原型的函數:

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 ;

}

運行結果如下:


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章