32 lines
804 B
C
32 lines
804 B
C
|
#pragma once
|
||
|
|
||
|
#include <memory>
|
||
|
|
||
|
class CThreadPool
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
template <typename T>
|
||
|
static void QueueUserWorkItem(void (T::*function)(void), T *object, ULONG flags = WT_EXECUTELONGFUNCTION)
|
||
|
{
|
||
|
typedef std::pair<void (T::*)(), T *> CallbackType;
|
||
|
std::auto_ptr<CallbackType> p(new CallbackType(function, object));
|
||
|
if (::QueueUserWorkItem(ThreadProc<T>, p.get(), flags))
|
||
|
p.release();
|
||
|
else
|
||
|
throw GetLastError();
|
||
|
}
|
||
|
|
||
|
private:
|
||
|
template <typename T>
|
||
|
static DWORD WINAPI ThreadProc(PVOID context)
|
||
|
{
|
||
|
typedef std::pair<void (T::*)(), T *> CallbackType;
|
||
|
|
||
|
std::auto_ptr<CallbackType> p(static_cast<CallbackType *>(context));
|
||
|
|
||
|
(p->second->*p->first)();
|
||
|
return 0;
|
||
|
}
|
||
|
};
|