simplethreadpool.h

来自「sspi_workbench」· C头文件 代码 · 共 44 行

H
44
字号
#pragma once

class SimpleThreadPool {
public:
    typedef void (*ERR_FCN)(const wchar_t*, bool, DWORD);
    typedef void (*WORKER_THREAD_PROC)(void* pCtx, int nType, void* pv);
    typedef bool (*WM_DISPATCH_FCN)(MSG& msg);

    SimpleThreadPool(ERR_FCN errFcn, WORKER_THREAD_PROC worker);
   ~SimpleThreadPool();

    void init();
    void postJob(void* pCtx, int nType, void* pv = 0, HANDLE hEvent = 0);
    bool executeJob(void* pCtx, int nType, void* pv, WM_DISPATCH_FCN wmDispatchFcn);
    bool close(DWORD nMillisecondsToWaitBeforeTerminatingThreads);
private:
    void operator=(const SimpleThreadPool&); // not impl
    struct Job {
        Job(void* _pCtx, int _nType, void* _pv, HANDLE _hEvent)
          : pCtx(_pCtx), nType(_nType), pv(_pv), hEvent(_hEvent)
        {}
        void*  pCtx;
        int    nType;
        void*  pv;
        HANDLE hEvent;
    };
    void _err(const wchar_t* psz, bool bRecoverable = false, DWORD err = GetLastError()) {
        m_errFcn(psz, bRecoverable, err);
    }
    bool _waitAndPumpMessages(DWORD cHandles, HANDLE* prgHandles, WM_DISPATCH_FCN wmDispatchFcn);
    bool _drainMessageQueue(WM_DISPATCH_FCN wmDispatchFcn);

    static DWORD WINAPI _threadProc(void* pv);
    static DWORD _calcThreadCount();

    const ERR_FCN      m_errFcn;
    const DWORD        m_cThreads;  // ORDER_DEPENDENCY
    HANDLE             m_iocp;      // io completion port
    WORKER_THREAD_PROC m_worker;
    HANDLE*            m_prgThreads; // ORDER_DEPENDENCY
    bool               m_bClosed;
};

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?