64,651
社区成员
发帖
与我相关
我的任务
分享
const unsigned int DEFAULT_POOL_SIZE = 10;
/*************************************************************************************************/
/*!
\brief CJobImpl
*/
/*************************************************************************************************/
class CJobImpl
{
public:
CJobImpl(){ };
virtual ~CJobImpl(){ };
virtual void DoJob()=0;
};
/*************************************************************************************************/
/*!
\brief CJob
*/
/*************************************************************************************************/
class CJob : public CJobImpl
{
public:
CJob();
CJob(string strInfo){ mStrInfo = strInfo;}
virtual ~CJob();
virtual void DoJob();
private:
string mStrInfo;
};
/*************************************************************************************************/
/*!
\brief CXJob
*/
/*************************************************************************************************/
class CXJob : public CJobImpl
{
public:
CXJob(){};
CXJob(string strInfo){ mStrInfo = strInfo;}
virtual ~CXJob(){};
virtual void DoJob(){ OutputDebugString(mStrInfo.c_str()); Sleep(3000);}
private:
string mStrInfo;
};
/*************************************************************************************************/
/*!
\brief tagThreadData
*/
/*************************************************************************************************/
typedef struct tagThreadData
{
HANDLE hEvents[2];
HANDLE hThread;
DWORD dwThreadId;
CJobImpl* jobObj;
CThreadPool* threadPool;
} ThreadData, *PThreadData;
//typedef map<DWORD, _ThreadData, less<DWORD>, allocator<_ThreadData> > ThreadMap;
typedef map<DWORD, PThreadData> ThreadDataMap;
typedef vector<CJobImpl*> JobList;
/*************************************************************************************************/
/*!
\brief tagJobRunData
*/
/*************************************************************************************************/
typedef struct tagJobRunData
{
CThreadPool* threadPool;
} JobRunData, *PJobRunData;
/*************************************************************************************************/
/*!
\brief CThreadPool
*/
/*************************************************************************************************/
class CThreadPool
{
public:
CThreadPool(DWORD size = DEFAULT_POOL_SIZE);
~CThreadPool();
ThreadData* GetIdleThred();
void AddThreadToIdleMap(ThreadData& threadData);
void Increase(DWORD size);
void Decrease(DWORD size);
private:
void SetExitEvent(ThreadData& threadData);
void RemoveThreadFromIdleMap(ThreadData& threadData);
void RemoveThreadFromDataMap(ThreadData& threadData);
void CreateThreadPool( DWORD size );
static UINT __stdcall PoolThreadProc(LPVOID pParam);
private:
CRITICAL_SECTION mCS;
ThreadDataMap mThreadDataMap;
ThreadDataMap mIdleThredMap;
DWORD mPoolSize;
};
/*************************************************************************************************/
/*!
\brief CThreadPoolManager
*/
/*************************************************************************************************/
class CThreadPoolManager
{
public:
CThreadPoolManager(DWORD size = DEFAULT_POOL_SIZE);
~CThreadPoolManager();
void Run();
void AddJob(CJobImpl* job);
void RemoveJob(CJobImpl* job);
CJobImpl* GetJob();
ThreadData& GetJobThreadData() { return mJobThreadData; }
CThreadPool* GetThreadPool() { return mThreadPool; }
void IncreasePool(DWORD size){ mThreadPool->Increase(size); }
void DecreasePool(DWORD size){ mThreadPool->Decrease(size); }
HANDLE GetExitEvent() const { return mExitEvent; }
void SetRunEvent(ThreadData& threadData);
private:
static UINT __stdcall JobThreadProc(LPVOID pParam);
private:
CRITICAL_SECTION mCS;
JobList mJobList;
CThreadPool* mThreadPool;
ThreadData mJobThreadData;
HANDLE mExitEvent;
};