WaitAndWorkInThreadPool.h

#pragma once

#include <windows.h>
#include "common.h"

//Thread Pools
//https://docs.microsoft.com/zh-cn/windows/win32/procthread/thread-pools


//对RegisterWaitForSingleObject的包装,功能为 “等到内核对象后立刻新起线程执行指定的例程,这个线程是被注册到windows thread pool 中的”


// 需要通过继承的方式实现,继承类必须实现WorkCB虚函数,使用起来灵活性差一点
// [当前不可用] 目前没想到好的方法让纯虚函数能够作为回调函数,后面有好的办法再实现
class WaitAndWorkInThreadPool_A
{
DEFAULT_COPY(WaitAndWorkInThreadPool_A)

public:
WaitAndWorkInThreadPool_A() = delete;
explicit WaitAndWorkInThreadPool_A(const HANDLE& waitfor,PVOID param = NULL, DWORD flag = WT_EXECUTEDEFAULT, DWORD timeout = INFINITE);
virtual ~WaitAndWorkInThreadPool_A();

protected:
virtual VOID NTAPI WorkCB(PVOID p, BOOLEAN b) = 0;

private:
HANDLE _h;
PVOID _p;
DWORD _f;
DWORD _t;
};


// 通过指定回调函数指正实现,使用起来灵活性强
class WaitAndWorkInThreadPool_B final
{
DEFAULT_COPY(WaitAndWorkInThreadPool_B)

public:
WaitAndWorkInThreadPool_B() = delete;
explicit WaitAndWorkInThreadPool_B(const HANDLE& waitfor, WAITORTIMERCALLBACK workcb ,PVOID param = NULL, DWORD flag = WT_EXECUTEDEFAULT, DWORD timeout = INFINITE);
~WaitAndWorkInThreadPool_B();
};

WaitAndWorkInThreadPool.cpp

#include "WaitAndWorkInThreadPool.h"

WaitAndWorkInThreadPool_A::WaitAndWorkInThreadPool_A(const HANDLE& waitfor, PVOID param, DWORD flag, DWORD timeout)
:_h(waitfor), _p(param) , _f(flag), _t(timeout)
{
PHANDLE tmp;
//RegisterWaitForSingleObject(tmp, _h, &WorkCB, _p, timeout, flag);
}

WaitAndWorkInThreadPool_A::~WaitAndWorkInThreadPool_A()
{

}

// ------------------------------------------------------------------------------------------------------------------

WaitAndWorkInThreadPool_B::WaitAndWorkInThreadPool_B(const HANDLE& waitfor, WAITORTIMERCALLBACK workcb, PVOID param , DWORD flag , DWORD timeout)
{
PHANDLE tmp = NULL;
RegisterWaitForSingleObject(tmp, waitfor, workcb, param, timeout, flag);
}

WaitAndWorkInThreadPool_B::~WaitAndWorkInThreadPool_B()
{

}