Go to the documentation of this file.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 #ifndef __cmtkThreadParameterArray_h_included_
00034 #define __cmtkThreadParameterArray_h_included_
00035
00036 #include <cmtkconfig.h>
00037
00038 #include <System/cmtkThreads.h>
00039 #include <System/cmtkThreadParameters.h>
00040
00041 namespace
00042 cmtk
00043 {
00044
00047
00052 template<class TClass,class TParam = ThreadParameters<TClass> >
00053 class ThreadParameterArray
00054 {
00055 public:
00059 ThreadParameterArray
00060 ( TClass *const thisObject, const size_t numberOfThreads )
00061 {
00062 this->m_AsynchronousThreadsRunning = false;
00063 this->m_NumberOfThreads = numberOfThreads;
00064 this->m_Ptr = Memory::AllocateArray<TParam>( numberOfThreads );
00065 for ( size_t i = 0; i < numberOfThreads; ++i )
00066 {
00067 this->m_Ptr[i].thisObject = thisObject;
00068 this->m_Ptr[i].ThisThreadIndex = i;
00069 this->m_Ptr[i].NumberOfThreads = numberOfThreads;
00070 this->m_Ptr[i].m_ThreadID = 0;
00071 }
00072 }
00073
00075 ~ThreadParameterArray()
00076 {
00077 if ( this->m_AsynchronousThreadsRunning )
00078 this->CancelAsynchronousThreads();
00079 Memory::DeleteArray( this->m_Ptr );
00080 }
00081
00083 const TParam& operator[]( const size_t i ) const { return this->m_Ptr[i]; }
00084
00086 TParam& operator[]( const size_t i ) { return this->m_Ptr[i]; }
00087
00089 TParam* GetPtr() { return this->m_Ptr; }
00090
00092 const TParam* GetPtr() const { return this->m_Ptr; }
00093
00095 size_t GetNumberOfThreads() const { return this->m_NumberOfThreads; }
00096
00098 void RunInParallel( ThreadFunction threadCall )
00099 {
00100 Threads::RunThreads( threadCall, this->GetNumberOfThreads(), this->GetPtr(), sizeof( TParam ) );
00101 }
00102
00104 void RunInParallelAsynchronous( ThreadFunction threadCall );
00105
00107 void JoinAsynchronousThreads();
00108
00110 void CancelAsynchronousThreads();
00111
00113 bool IsRunning( const size_t idx )
00114 {
00115 return this->m_Ptr[idx].m_ThreadID;
00116 }
00117
00119 void RunInParallelFIFO(ThreadFunction threadCall, const size_t numberOfThreadsTotal, const size_t firstThreadIdx = 0 );
00120
00121 private:
00123 size_t m_NumberOfThreads;
00124
00126 TParam* m_Ptr;
00127
00129 bool m_AsynchronousThreadsRunning;
00130 };
00131
00133
00134 }
00135
00136 #include "cmtkThreadParameterArray.txx"
00137
00138 #endif // #ifndef __cmtkThreadParameterArray_h_included_