00001
00043 #ifndef INC_MI32_MITHREAD_H
00044 #define INC_MI32_MITHREAD_H
00045
00046 #ifndef INC_MI32_DELEGATE_H
00047 #include <mi32/delegate.h>
00048 #endif
00049
00050 #ifndef INC_MI32_ERRHANDLER_H
00051 #include <mi32/errhandler.h>
00052 #endif
00053
00054 #ifdef MISYSTEMDLL
00055 #define CLASSLIBEXPORT MI_DLLCLASSEXPORT
00056 #else
00057 #define CLASSLIBEXPORT MI_DLLCLASSIMPORT
00058 #endif
00059
00060 #if defined(WIN32) && defined(AddJob)
00061 #undef AddJob
00062 #endif
00063
00064
00065 #ifndef GENERATING_DOXYGEN_OUTPUT
00066
00067 class MISTATUSMANAGER;
00068 namespace MITHREAD {
00069 class JOB;
00070 class QUEUE;
00071 class POOL;
00072 struct POOLITEM;
00073 class POOLJOB;
00074 struct QUEUEITEM;
00075 struct QUEUEITEMLIST;
00076 }
00077 #endif
00078
00079
00081 namespace MITHREAD {
00082
00083 typedef UINT32 ID;
00084
00086 typedef fastdelegate::FastDelegate<void(MITHREAD::ID)> DELEGATE_VOID_ID;
00087
00089 class CLASSLIBEXPORT WORKER {
00090 public:
00092 explicit WORKER (
00093 MISTATUSMANAGER* DftManager = 0,
00094 const char* DebugName = 0
00095 );
00096
00099 ~WORKER (
00100 );
00101
00103 void CancelJob (
00104 );
00105
00109 void ExecuteJob (
00110 JOB& Job
00111 );
00112
00115 bool IsCanceling (
00116 ) const;
00117
00118 #ifndef GENERATING_DOXYGEN_OUTPUT
00119 class PRIV;
00120 PRIV* GetPriv () { return (m_pPriv); }
00121 #endif
00122
00123 private:
00124 #ifndef GENERATING_DOXYGEN_OUTPUT
00125 WORKER (const WORKER&);
00126 WORKER& operator=(const WORKER&);
00127
00128 PRIV* m_pPriv;
00129 friend class JOB;
00130 friend class POOL;
00131 #endif // GENERATING_DOXYGEN_OUTPUT
00132 };
00133
00134
00138 class CLASSLIBEXPORT POOL {
00139 public:
00140
00142 POOL (
00143 UINT32 NumPoolThreads = 0,
00144 MISTATUSMANAGER* DftManager = 0,
00145 bool IncludeLogicalCores = false
00146 );
00147
00150 ~POOL (
00151 );
00152
00155 ID AddQueue (
00156 QUEUE& Queue,
00157 bool AddToFront = false
00158 );
00159
00162 ID AddQueue (
00163 QUEUE& Queue,
00164 JOB& Job
00165
00166
00167 );
00168
00171 void CancelJob (
00172 ID JobID
00173 );
00174
00177 void CancelQueue (
00178 ID QueueID
00179 );
00180
00184 UINT32 GetNumActiveThreads () const;
00185
00187 void SetDelegateOnCompletion (
00188 DELEGATE_VOID_NOPARMS OnCompletion
00189 );
00190
00192 void StartQueuedJobs ();
00193
00196 void SuspendQueuedJobs ();
00197
00199 void WaitForCompletion ();
00200
00201 private:
00202 #ifndef GENERATING_DOXYGEN_OUTPUT
00203 POOL (const POOL&);
00204 POOL& operator=(const POOL&);
00205
00206 class PRIV;
00207 PRIV* m_pPriv;
00208 friend class JOB;
00209 friend class POOLJOB;
00210 friend struct POOLITEM;
00211 friend class QUEUE;
00212 friend class WORKER::PRIV;
00213 #endif // GENERATING_DOXYGEN_OUTPUT
00214 };
00215
00216
00221 class CLASSLIBEXPORT QUEUE {
00222 public:
00223
00224 enum FLAGS {
00225 FLAG_Default = 0x0000,
00226 FLAG_Synchronized = 0x0001
00227 };
00228
00230 explicit QUEUE (
00231 FLAGS flags = FLAG_Default
00232 );
00233
00235 QUEUE (
00236 const QUEUE& rhs
00237 );
00238
00240 ~QUEUE (
00241 );
00242
00244 QUEUE& operator=(
00245 const QUEUE& rhs
00246 );
00247
00250 ID AddJob (
00251 JOB& Job,
00252 bool AddToFront = false
00253 );
00254
00257 ID AddQueue (
00258 QUEUE& Queue,
00259 bool AddToFront = false
00260 );
00261
00264 FLAGS GetFlags (
00265 ) const;
00266
00269 ID GetID (
00270 ) const;
00271
00274 bool IsEmpty (
00275 ) const;
00276
00278 void SetDelegateOnCompletion (
00279 DELEGATE_VOID_ID delegate
00280 );
00281
00282 private:
00283 #ifndef GENERATING_DOXYGEN_OUTPUT
00284 class PRIV;
00285 PRIV* m_pPriv;
00286 friend class JOB;
00287 friend struct QUEUEITEM;
00288 friend struct QUEUEITEMLIST;
00289 friend class POOL::PRIV;
00290 #endif // GENERATING_DOXYGEN_OUTPUT
00291 };
00292
00294 class CLASSLIBEXPORT JOB {
00295 public:
00296 enum FLAGS {
00297 FLAG_Default = 0x0000,
00298 FLAG_Synchronized = 0x0001,
00299 FLAG_DeleteWhenCompleted = 0x0002,
00300 FLAG_StopIfError = 0x0004
00301 };
00302
00304 explicit JOB (
00305 FLAGS flags = FLAG_Default,
00306 MISTATUSMANAGER* Manager = 0
00307 );
00308
00310 virtual ~JOB (
00311 ) = 0;
00312
00318 const ERRORSTATE& GetErrorState (
00319 ) const { return (m_ErrorState); }
00320
00323 FLAGS GetFlags (
00324 ) const { return (m_JobFlags); }
00325
00328 ID GetID (
00329 ) const { return (m_ID); }
00330
00332 void SetDelegateOnCancelBeforeRun (
00333 DELEGATE_VOID_ID delegate
00334 ) { m_DelegateOnCancelBeforeRun = delegate; }
00335
00337 void SetDelegateOnCompletion (
00338 DELEGATE_VOID_ID delegate
00339 ) { m_DelegateOnCompletion = delegate; }
00340
00341 protected:
00342
00345 WORKER* GetWorker (
00346 ) { return (m_Worker); }
00347
00350 ERRVALUE CheckCancel (
00351 );
00352
00353 private:
00354
00356 virtual void v_OnCancelBeforeRun ();
00357
00360 virtual ERRVALUE v_RunJob () = 0;
00361
00362 #ifndef GENERATING_DOXYGEN_OUTPUT
00363 JOB (const JOB&);
00364 JOB& operator=(const JOB&);
00365
00366 void NotifyCancelBeforeRun ();
00367 ERRVALUE RunJob ();
00368
00369 ID m_ID;
00370 FLAGS m_JobFlags;
00371 ERRORSTATE m_ErrorState;
00372 DELEGATE_VOID_ID m_DelegateOnCancelBeforeRun;
00373 DELEGATE_VOID_ID m_DelegateOnCompletion;
00374 QUEUE::PRIV* m_ParentQueuePriv;
00375 WORKER* m_Worker;
00376 MISTATUSMANAGER* m_pManager;
00377
00378 friend struct QUEUEITEM;
00379 friend class QUEUE::PRIV;
00380 friend class WORKER::PRIV;
00381 friend class POOLJOB;
00382 friend class POOL::PRIV;
00383 #endif // GENERATING_DOXYGEN_OUTPUT
00384 };
00385
00386
00390 class CLASSLIBEXPORT WORKER_DETACHED {
00391 protected:
00394 WORKER_DETACHED ();
00395 virtual ~WORKER_DETACHED () = 0;
00396
00399 void ExecuteThread (
00400 MISTATUSMANAGER* manager = 0,
00401 const char* DebugName = 0
00402 );
00403
00404 private:
00406 virtual void v_ExecuteThread () = 0;
00407
00408 #ifndef GENERATING_DOXYGEN_OUTPUT
00409 MISTATUSMANAGER* m_pManager;
00410 const char* m_pDebugName;
00411 #if defined(WIN32)
00412 friend UINT32 __stdcall MyThreadFunc (void *vpwd);
00413 #else
00414 friend void* MyThreadFunc (void *vpwd);
00415 #endif
00416 #endif // GENERATING_DOXYGEN_OUTPUT
00417 };
00418
00419 }
00420
00421 #ifndef GENERATING_DOXYGEN_OUTPUT
00422 DEFINE_ENUM_OP_BITWISE(MITHREAD::JOB::FLAGS)
00423 DEFINE_ENUM_OP_BITWISE(MITHREAD::QUEUE::FLAGS)
00424 #endif // GENERATING_DOXYGEN_OUTPUT
00425
00426 #undef CLASSLIBEXPORT
00427
00428 #endif