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 ;

}

运行结果如下:

Windows核心编程--线程池内核对象触发调用函数