00001 /* 00002 * This file contains class that encapsulates system thread. 00003 * 00004 * Author: 00005 * Tomas Mrkvicka 00006 * xmrkvi03@stud.fit.vutbr.cz 00007 * 00008 */ 00009 00010 #include <windows.h> 00011 00012 //FORWARD DECLARATIONS 00013 namespace NSPipeline 00014 { 00015 class TThread; 00016 }; 00017 00018 #ifndef _PIPELINE_THREAD_HH_ 00019 #define _PIPELINE_THREAD_HH_ 00020 00021 /** Novy typ pro specifikaci ukazatele na funkci spoustenou vlaknem. 00022 */ 00023 typedef DWORD (*FUNC_PTR)(void*); 00024 00025 namespace NSPipeline 00026 { 00027 00028 //////////////////////////////////////////////////////////////////////////////// 00029 //////////////////////////////////////////////////////////////////////////////// 00030 //////////////////////////////////////////////////////////////////////////////// 00031 // TThread 00032 00033 /** Tato trida reprezentuje jednoduche vlakno. 00034 * 00035 * Vlakno se spousti metodou TThread::Run(). 00036 * 00037 * Po spusteni by melo byt vlakno ukonceno nejakym externim mechanismem (napr. promennou), ktera 00038 * ve vykonavaci funkci kontroluje beh smycky. Vlakno by melo byt spravne ukonceno tak, ze 00039 * metoda TThread::IsTerminated() vrati TRUE a nasledne staci zavolat metodu TThread::Finish(), ktera 00040 * zajisti vycisteni promennych uvnitr.. 00041 * 00042 * Vlakno lze prerusit nasilim pomoci metody TThread::Terminate() - pouziti teto metody je vsak nebezpecne 00043 * protoze uvnitr beziciho vlakna muzou zustat nealokovane zdroje, otevrene synchronizacni mechanismy apod. 00044 * 00045 * \warning Funkce spoustena vlaknem musi vracet hodnotu typu DWORD. Tato hodnota 00046 * nesmi byt v zadnem pripade shodna s hodnotou STILL_ACTIVE. V tom pripade by totiz 00047 * nebylo mozne rozeznat jiz dokoncenou funkci (toto chovani vychazi z implementace vlakne ve Windows). 00048 */ 00049 class TThread 00050 { 00051 //PUBLIC METHODS 00052 public: 00053 TThread(void); 00054 ~TThread(void); 00055 00056 BOOL Run(FUNC_PTR function,void * params); 00057 BOOL IsRunning(void) const; 00058 BOOL IsTerminated(void); 00059 BOOL Finish(void); 00060 BOOL Terminate(void); 00061 00062 //PRIVATE FAKE METHODS 00063 private: 00064 TThread( const TThread & orig ); ///< falesny kopirovaci konstruktor 00065 void operator=( const TThread & orig ); ///< falesny prirazovaci operator 00066 00067 //PRIVATE COMPONENTS 00068 private: 00069 HANDLE m_thread; ///< handle na vytvorene vlakno 00070 }; 00071 //OK 2007-08-25 00:04:59 B04-315B\Tom 00072 00073 /** Konstruktor. 00074 * 00075 * Vytvori neinicializovane vlakno. 00076 * To musi byt nasledne spusteno metodou Run(). 00077 */ 00078 inline TThread::TThread(void) 00079 { 00080 m_thread = NULL; 00081 } 00082 //OK 2007-08-25 00:05:02 B04-315B\Tom 00083 00084 /** Destruktor. 00085 * 00086 * Mel by byt volan pouze na radne ukoncene vlakno, tj. metoda IsTerminated() vraci 00087 * TRUE a nasledna metoda Finish() vycisti objekt. 00088 * 00089 * Pokud vlakno neni radne ukonceno pak se jej destruktor pokusi ukoncit, coz ale 00090 * muze zpusobit problemy, protoze to muze znamenat preruseni beziciho vlakna napr. po vstupu 00091 * do kriticke sekce apod. 00092 */ 00093 inline TThread::~TThread(void) 00094 { 00095 if( m_thread ) 00096 { 00097 Terminate(); 00098 } 00099 } 00100 //OK 2007-08-25 00:08:29 B04-315B\Tom 00101 00102 // TThread 00103 //////////////////////////////////////////////////////////////////////////////// 00104 //////////////////////////////////////////////////////////////////////////////// 00105 //////////////////////////////////////////////////////////////////////////////// 00106 00107 };//end of NSPipeline 00108 using namespace NSPipeline; 00109 00110 #endif