如果想注册一个工作项,等待一个内核对象被触发的时候去执行,与之前说过的步骤很相似,首先编写如下原型的函数:
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:
————————————————
#include<windows.h>
#include<tchar.h>
#include <iostream>
using namespace std;
HANDLE g_hEvent;
PTP_WAIT pWait;
VOID CALLBACK WaitFuncCallback(PTP_CALLBACK_INSTANCE Instance, PVOID Context, PTP_WAIT Wait, TP_WAIT_RESULT WaitResult)
{
_tprintf(_T("WaitFuncCallback is called, data = %d\n"), *(int*)Context);
ResetEvent(g_hEvent);
}
int main()
{
INT dd = 5;
g_hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
if (g_hEvent == NULL)
{
_tprintf(_T("CreateEvent failed:%u\n"), GetLastError());
return -1;
}
pWait = CreateThreadpoolWait(WaitFuncCallback, &dd, NULL);
if (pWait == NULL)
{
_tprintf(_T("Impossible to create the pWait:%u"), GetLastError());
return -1;
}
int nLoopTimes = 0;
while (nLoopTimes < 10)
{
_tprintf(_T("The %d loop.\n"), nLoopTimes++);
SetThreadpoolWait(pWait, g_hEvent, NULL);
SetEvent(g_hEvent);
Sleep(200); //等待内核对象被触发,调用回调函数
}
WaitForThreadpoolWaitCallbacks(pWait, FALSE);
CloseThreadpoolWait(pWait);
CloseHandle(g_hEvent);
return 0;
}