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 #include <map>
00050
00051 KOMODIA_NAMESPACE_START
00052
00053 class CGenericSemaphore;
00054 class CGenericCriticalSection;
00055 class CGenericEvent;
00056
00057
00058 #define MAX_POOL_THREADS 200
00059
00060
00061 #define THREAD_POOL_DEFAULT_JOBS 20
00062
00063 class CThreadPool : public CErrorHandler
00064 {
00065 public:
00066
00067 typedef enum _COMInit
00068 {
00069 ciNone,
00070 ciSingle,
00071 ciApartment,
00072 ciMulti
00073 } COMInit;
00074
00075
00076 typedef void (*ThreadPoolProc)(LPVOID pParam);
00077 typedef ThreadPoolProc LPThreadPoolProc;
00078
00079
00080 typedef DWORD (*ThreadDWORDPoolProc)(LPVOID pParam);
00081 typedef ThreadDWORDPoolProc LPThreadDWORDPoolProc;
00082
00083
00084 typedef void (*ThreadPoolDataProc)(LPVOID pParam,
00085 LPVOID pThreadData);
00086 typedef ThreadPoolDataProc LPThreadPoolDataProc;
00087
00088
00089 typedef BOOL (*InitializePoolProc)(LPVOID& pParam,
00090 BOOL bLoading);
00091 typedef InitializePoolProc LPInitializePoolProc;
00092 public:
00093
00094 void SetPoolName(const std::string& rName);
00095
00096
00097 void SetTimeout(DWORD dwTimeout);
00098
00099
00100 DWORD GetTimeout()const;
00101
00102
00103 void FastStop();
00104
00105
00106 int GetJobsRan()const;
00107
00108
00109 void Clear();
00110
00111
00112 void SetExtraDataDrop(BOOL bDrop);
00113
00114
00115 void SetSleepInterval(DWORD dwSleepInterval);
00116
00117
00118 BOOL IsInitialized()const;
00119
00120
00121 int GetRunningThreads()const;
00122
00123
00124 DWORD GetMaxThreads()const;
00125
00126
00127 BOOL IsFinished()const;
00128
00129
00130 int GetWaitingJobs()const;
00131
00132
00133 BOOL SubmitJob(LPThreadPoolProc pJobProc,
00134 LPVOID lpData);
00135 BOOL SubmitJob(LPThreadDWORDPoolProc pJobProc,
00136 LPVOID lpData);
00137 BOOL SubmitJob(LPThreadPoolDataProc pJobProc,
00138 LPVOID lpData);
00139
00140
00141
00142
00143
00144
00145 CThreadPool(unsigned long ulNumberOfThreads,
00146 unsigned long ulMaxJobsPending=THREAD_POOL_DEFAULT_JOBS,
00147 LPInitializePoolProc pInitializeProc=NULL,
00148 CGenericThread::ThreadPriority aPriority=CGenericThread::tpNormal,
00149 COMInit bInitializeCOM=ciNone);
00150 virtual ~CThreadPool();
00151 private:
00152
00153 typedef struct _JobData
00154 {
00155 LPThreadPoolProc pProc;
00156 LPThreadDWORDPoolProc pDWORDProc;
00157 LPThreadPoolDataProc pDataProc;
00158 LPVOID pParam;
00159 } JobData;
00160
00161
00162 typedef std::deque<JobData> JobVector;
00163
00164
00165 typedef struct _ThreadData
00166 {
00167 CGenericEvent* pEvent;
00168 CGenericEvent* pExitEvent;
00169 CThreadPool* pClass;
00170 LPInitializePoolProc pInitializeProc;
00171 COMInit bCOM;
00172 bool bInsideThread;
00173 } ThreadData;
00174 private:
00175
00176 CThreadPool(const CThreadPool& rPool);
00177
00178
00179 CThreadPool& operator=(const CThreadPool& rPool);
00180
00181
00182 BOOL SubmitJob(LPThreadPoolProc pJobProc,
00183 LPThreadDWORDPoolProc pDWORDJobProc,
00184 LPThreadPoolDataProc pDataProc,
00185 LPVOID lpData);
00186
00187
00188 void ReSetThreadCount(int iIncrement);
00189
00190
00191 void ClearThreads(bool bFast=false);
00192
00193
00194 void GetJob(JobData& aData);
00195
00196
00197 CGenericSemaphore* GetSemaphore()const;
00198
00199
00200 BOOL SpawnThreads(LPInitializePoolProc pInitializeProc,
00201 CGenericThread::ThreadPriority aPriority,
00202 COMInit bCOM);
00203
00204
00205 static DWORD PoolThread(LPVOID pParam);
00206
00207
00208 unsigned long m_ulThreadCount;
00209
00210
00211 unsigned long m_ulJobsCount;
00212
00213
00214 CGenericCriticalSection* m_pCSection;
00215 CGenericCriticalSection* m_pCSectionCounter;
00216
00217
00218 CGenericThread** m_ppThreads;
00219
00220
00221 CGenericSemaphore* m_pSemaphore;
00222
00223
00224 JobVector m_aJobList;
00225
00226
00227 ThreadData** m_ppThreadData;
00228
00229
00230 int m_iRunningThreads;
00231
00232
00233 int m_iMaxJobsPending;
00234
00235
00236 BOOL m_bInitialized;
00237
00238
00239 DWORD m_dwSleepInterval;
00240
00241
00242 BOOL m_bDrop;
00243
00244
00245 int m_iTotalJobsRan;
00246
00247
00248 COMInit m_bInitializeCOM;
00249
00250
00251 DWORD m_dwTimeout;
00252
00253
00254 std::string m_sName;
00255 };
00256
00257 class CThreadPoolManager
00258 {
00259 public:
00260
00261 CThreadPool* GetPool(DWORD dwThreads);
00262
00263
00264 void ReleasePool(CThreadPool* pPool);
00265
00266
00267 void ReleasePool(CThreadPool** ppPool);
00268
00269
00270 static CThreadPoolManager& GetInstance();
00271
00272
00273 CThreadPoolManager();
00274 virtual ~CThreadPoolManager();
00275 private:
00276
00277 typedef std::multimap<DWORD,CThreadPool*> PoolMap;
00278 private:
00279
00280 CThreadPoolManager(const CThreadPoolManager& rManager);
00281
00282
00283 CThreadPoolManager& operator=(const CThreadPoolManager& rManager);
00284
00285
00286 CGenericCriticalSection* m_pCS;
00287
00288
00289 PoolMap m_aData;
00290
00291
00292 static CThreadPoolManager m_aInstance;
00293 };
00294
00295 KOMODIA_NAMESPACE_END
00296
00297 #endif // !defined(AFX_KOMODIATHREADPOOL_H__D3F7BADC_92DA_4C70_A2BF_090924E69D81__INCLUDED_)