线程池内核对象触发调用函数

如果想注册一个工作项,等待一个内核对象被触发的时候去执行,与之前说过的步骤很相似,首先编写如下原型的函数:

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值