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 int GetJobsRan()const;
00085
00086
00087 void Clear();
00088
00089
00090 void SetExtraDataDrop(BOOL bDrop);
00091
00092
00093 void SetSleepInterval(DWORD dwSleepInterval);
00094
00095
00096 BOOL IsInitialized()const;
00097
00098
00099 int GetRunningThreads()const;
00100
00101
00102 DWORD GetMaxThreads()const;
00103
00104
00105 BOOL IsFinished()const;
00106
00107
00108 int GetWaitingJobs()const;
00109
00110
00111 BOOL SubmitJob(LPThreadPoolProc pJobProc,
00112 LPVOID lpData);
00113 BOOL SubmitJob(LPThreadDWORDPoolProc pJobProc,
00114 LPVOID lpData);
00115 BOOL SubmitJob(LPThreadPoolDataProc pJobProc,
00116 LPVOID lpData);
00117
00118
00119
00120
00121
00122
00123 CThreadPool(unsigned long ulNumberOfThreads,
00124 unsigned long ulMaxJobsPending=THREAD_POOL_DEFAULT_JOBS,
00125 LPInitializePoolProc pInitializeProc=NULL,
00126 CGenericThread::ThreadPriority aPriority=CGenericThread::tpNormal,
00127 BOOL bInitializeCOM=FALSE);
00128 virtual ~CThreadPool();
00129 private:
00130
00131 typedef struct _JobData
00132 {
00133 LPThreadPoolProc pProc;
00134 LPThreadDWORDPoolProc pDWORDProc;
00135 LPThreadPoolDataProc pDataProc;
00136 LPVOID pParam;
00137 } JobData;
00138
00139
00140 typedef std::deque<JobData> JobVector;
00141
00142
00143 typedef struct _ThreadData
00144 {
00145 CGenericEvent* pEvent;
00146 CGenericEvent* pExitEvent;
00147 CThreadPool* pClass;
00148 LPInitializePoolProc pInitializeProc;
00149 BOOL bCOM;
00150 } ThreadData;
00151 private:
00152
00153 CThreadPool(const CThreadPool& rPool);
00154
00155
00156 CThreadPool& operator=(const CThreadPool& rPool);
00157
00158
00159 BOOL SubmitJob(LPThreadPoolProc pJobProc,
00160 LPThreadDWORDPoolProc pDWORDJobProc,
00161 LPThreadPoolDataProc pDataProc,
00162 LPVOID lpData);
00163
00164
00165 void ReSetThreadCount(int iIncrement);
00166
00167
00168 void ClearThreads();
00169
00170
00171 void GetJob(JobData& aData);
00172
00173
00174 CGenericSemaphore* GetSemaphore()const;
00175
00176
00177 BOOL SpawnThreads(LPInitializePoolProc pInitializeProc,
00178 CGenericThread::ThreadPriority aPriority,
00179 BOOL bCOM);
00180
00181
00182 static DWORD PoolThread(LPVOID pParam);
00183
00184
00185 unsigned long m_ulThreadCount;
00186
00187
00188 unsigned long m_ulJobsCount;
00189
00190
00191 CGenericCriticalSection* m_pCSection;
00192 CGenericCriticalSection* m_pCSectionCounter;
00193
00194
00195 CGenericThread** m_ppThreads;
00196
00197
00198 CGenericSemaphore* m_pSemaphore;
00199
00200
00201 JobVector m_aJobList;
00202
00203
00204 ThreadData** m_ppThreadData;
00205
00206
00207 int m_iRunningThreads;
00208
00209
00210 int m_iMaxJobsPending;
00211
00212
00213 BOOL m_bInitialized;
00214
00215
00216 DWORD m_dwSleepInterval;
00217
00218
00219 BOOL m_bDrop;
00220
00221
00222 int m_iTotalJobsRan;
00223
00224
00225 BOOL m_bInitializeCOM;
00226 };
00227
00228 KOMODIA_NAMESPACE_END
00229
00230 #endif // !defined(AFX_KOMODIATHREADPOOL_H__D3F7BADC_92DA_4C70_A2BF_090924E69D81__INCLUDED_)