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;
|
|
}
|
|
};
|