/** @file @brief @version 2012-11-08 SammyLan */ #pragma once #include <memory> BEGIN_NAMESPACE(XLANUtil) template <typename T> class XLANThreadPool { typedef std::pair<void (T::*)(), T *> ThreadInfo; public: static BOOL QueueUserWorkItem(void (T::*function)(void), T *object, ULONG flags = WT_EXECUTELONGFUNCTION) { std::auto_ptr<ThreadInfo> p(new ThreadInfo(function, object)); if (::QueueUserWorkItem(ThreadProc, p.get(), flags)) { //现在由线程函数负责删除前面申请的内存 p.release(); return TRUE; } else { return FALSE; } } private: static DWORD WINAPI ThreadProc(PVOID context) { std::auto_ptr<ThreadInfo> p(static_cast<ThreadInfo *>(context)); (p->second->*p->first)(); return 0; } }; template <typename T> inline BOOL XLANQueueUserWorkItem(T *object,void (T::*function)(void), ULONG flags = WT_EXECUTELONGFUNCTION) { return XLANThreadPool<T>::QueueUserWorkItem(function,object,WT_EXECUTELONGFUNCTION); } template <typename T> class XLANThreadObject { typedef unsigned int uint; typedef std::pair<void (T::*)(), T *> ThreadInfo; public: static HANDLE CreateThread(void (T::*function)(void), T *object) { std::auto_ptr<ThreadInfo> p(new ThreadInfo(function, object)); uint dwTHreadID = 0; HANDLE hThread = (HANDLE)_beginthreadex( NULL, 0, &ThreadProc, p.get(),0,&dwTHreadID); if (hThread != NULL) { //现在由线程函数负责删除前面申请的内存 p.release(); } return hThread; } private: static uint WINAPI ThreadProc(PVOID context) { std::auto_ptr<ThreadInfo> p(static_cast<ThreadInfo *>(context)); (p->second->*p->first)(); return 0; } }; template <typename T> inline HANDLE XLANCreateThread(T *object,void (T::*function)(void)) { return XLANThreadObject<T>::CreateThread(function,object); } END_NAMESPACE()
例子:
#include "XLANUtil/XLANThreadPool.h" class MyTest { public: void Test() { XLANUtil::XLANCreateThread(this,&MyTest::Calc); XLANUtil::XLANQueueUserWorkItem(this,&MyTest::Calc); } private: void Calc() { } };