00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036 #if !defined(AFX_KOMODIATHREADPOOL_H__D3F7BADC_92DA_4C70_A2BF_090924E69D81__INCLUDED_)
00037 #define AFX_KOMODIATHREADPOOL_H__D3F7BADC_92DA_4C70_A2BF_090924E69D81__INCLUDED_
00038
00039 #if _MSC_VER > 1000
00040 #pragma once
00041 #endif // _MSC_VER > 1000
00042
00043 #pragma warning(disable : 4786)
00044
00045 #include "ErrorHandler.h"
00046 #include "GenericThread.h"
00047
00048 #include <deque>
00049
00050 KOMODIA_NAMESPACE_START
00051
00052 class CGenericSemaphore;
00053 class CGenericCriticalSection;
00054 class CGenericEvent;
00055
00056
00057 #define MAX_POOL_THREADS 200
00058
00059
00060 #define THREAD_POOL_DEFAULT_JOBS 20
00061
00062 class CThreadPool : public CErrorHandler
00063 {
00064 public:
00065
00066 typedef VOID (*ThreadPoolProc)(LPVOID pParam);
00067 typedef ThreadPoolProc LPThreadPoolProc;
00068
00069
00070 typedef DWORD (*ThreadDWORDPoolProc)(LPVOID pParam);
00071 typedef ThreadDWORDPoolProc LPThreadDWORDPoolProc;
00072
00073
00074 typedef VOID (*ThreadPoolDataProc)(LPVOID pParam,
00075 LPVOID pThreadData);
00076 typedef ThreadPoolDataProc LPThreadPoolDataProc;
00077
00078
00079 typedef BOOL (*InitializePoolProc)(LPVOID& pParam,
00080 BOOL bLoading);
00081 typedef InitializePoolProc LPInitializePoolProc;
00082 public:
00083
00084 void Clear();
00085
00086
00087 void SetExtraDataDrop(BOOL bDrop);
00088
00089
00090 void SetSleepInterval(DWORD dwSleepInterval);
00091
00092
00093 BOOL IsInitialized()const;
00094
00095
00096 int GetRunningThreads()const;
00097
00098
00099 DWORD GetMaxThreads()const;
00100
00101
00102 BOOL IsFinished()const;
00103
00104
00105 int GetWaitingJobs()const;
00106
00107
00108 BOOL SubmitJob(LPThreadPoolProc pJobProc,
00109 LPVOID lpData);
00110 BOOL SubmitJob(LPThreadDWORDPoolProc pJobProc,
00111 LPVOID lpData);
00112 BOOL SubmitJob(LPThreadPoolDataProc pJobProc,
00113 LPVOID lpData);
00114
00115
00116
00117
00118
00119
00120 CThreadPool(unsigned long ulNumberOfThreads,
00121 unsigned long ulMaxJobsPending=THREAD_POOL_DEFAULT_JOBS,
00122 LPInitializePoolProc pInitializeProc=NULL,
00123 CGenericThread::ThreadPriority aPriority=CGenericThread::tpNormal);
00124 virtual ~CThreadPool();
00125 private:
00126
00127 typedef struct _JobData
00128 {
00129 LPThreadPoolProc pProc;
00130 LPThreadDWORDPoolProc pDWORDProc;
00131 LPThreadPoolDataProc pDataProc;
00132 LPVOID pParam;
00133 } JobData;
00134
00135
00136 typedef std::deque<JobData> JobVector;
00137
00138
00139 typedef struct _ThreadData
00140 {
00141 CGenericEvent* pEvent;
00142 CGenericEvent* pExitEvent;
00143 CThreadPool* pClass;
00144 LPInitializePoolProc pInitializeProc;
00145 } ThreadData;
00146 private:
00147
00148 CThreadPool(const CThreadPool& rPool);
00149
00150
00151 CThreadPool& operator=(const CThreadPool& rPool);
00152
00153
00154 BOOL SubmitJob(LPThreadPoolProc pJobProc,
00155 LPThreadDWORDPoolProc pDWORDJobProc,
00156 LPThreadPoolDataProc pDataProc,
00157 LPVOID lpData);
00158
00159
00160 void ReSetThreadCount(int iIncrement);
00161
00162
00163 void ClearThreads();
00164
00165
00166 void GetJob(JobData& aData);
00167
00168
00169 CGenericSemaphore* GetSemaphore()const;
00170
00171
00172 BOOL SpawnThreads(LPInitializePoolProc pInitializeProc,
00173 CGenericThread::ThreadPriority aPriority);
00174
00175
00176 static DWORD PoolThread(LPVOID pParam);
00177
00178
00179 unsigned long m_ulThreadCount;
00180
00181
00182 unsigned long m_ulJobsCount;
00183
00184
00185 CGenericCriticalSection* m_pCSection;
00186 CGenericCriticalSection* m_pCSectionCounter;
00187
00188
00189 CGenericThread** m_ppThreads;
00190
00191
00192 CGenericSemaphore* m_pSemaphore;
00193
00194
00195 JobVector m_aJobList;
00196
00197
00198 ThreadData** m_ppThreadData;
00199
00200
00201 int m_iRunningThreads;
00202
00203
00204 int m_iMaxJobsPending;
00205
00206
00207 BOOL m_bInitialized;
00208
00209
00210 DWORD m_dwSleepInterval;
00211
00212
00213 BOOL m_bDrop;
00214 };
00215
00216 KOMODIA_NAMESPACE_END
00217
00218 #endif // !defined(AFX_KOMODIATHREADPOOL_H__D3F7BADC_92DA_4C70_A2BF_090924E69D81__INCLUDED_)