Thread.h

Go to the documentation of this file.
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

Generated on Sat Nov 17 16:23:26 2007 for Image Processing Pipeline by  doxygen 1.4.6-NO