Thread.h 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. #ifndef Thread_H
  2. #define Thread_H
  3. #include "Array.h"
  4. #include "ReferenceCounter.h"
  5. namespace Framework
  6. {
  7. class Thread;
  8. class Critical;
  9. //! Ein neuer Thread wie die Thread Klasse aus Java
  10. class Thread : public virtual ReferenceCounter
  11. {
  12. private:
  13. pthread_t *threadHandleSys;
  14. int lockCount;
  15. protected:
  16. unsigned long threadId;
  17. pthread_t threadHandle;
  18. bool run;
  19. public:
  20. //! Konstruktor
  21. DLLEXPORT Thread();
  22. //! Destruktor
  23. DLLEXPORT virtual ~Thread();
  24. //! Startet den neuen Thread
  25. DLLEXPORT void start();
  26. #ifdef WIN32
  27. //! Pausiert den Thread (Nur für Windows)
  28. DLLEXPORT void pause();
  29. //! Setzt den Thread Fort (Nur für Windows)
  30. DLLEXPORT void fortsetzen();
  31. #endif
  32. //! Beendet den Thread
  33. DLLEXPORT void ende();
  34. //! Diese Funktion wird von dem neuen Thread ausgeführt.
  35. DLLEXPORT virtual void thread();
  36. //! Diese Funktion wird eufgerufen, nachdem die thread Funktion zuende ist
  37. DLLEXPORT virtual void threadEnd();
  38. //! prüft, ob der Thrad aktiv ist
  39. //! return: true, falls der Thread läuft.
  40. //! false, wenn der Thread beendet, pausiert oder noch nicht gestartet wurde.
  41. DLLEXPORT bool isRunning() const;
  42. //! wartet zeit lang auf den Thread
  43. //! \param zeit Die Zeit, die auf den Thread gewartet werden soll. 1000 = 1 Sekunde
  44. DLLEXPORT int warteAufThread( int zeit );
  45. //! Legt einen Frameworkpointer auf ein Threadhandle fest, der auf 0 gesetzt wird, falls die Ressourcen des Threads bereits follstänfig aufgeräumt wurden
  46. //! \param ths Ein Zeiger auf ein Threadhandle, das verändert werden soll
  47. void setSystemHandlePointer( pthread_t *ths );
  48. //! Gibt ein Handle auf den Thread zurück
  49. DLLEXPORT pthread_t getThreadHandle() const;
  50. private:
  51. void addCriticalLock();
  52. void removeCriticalLock();
  53. friend Critical;
  54. };
  55. #ifdef WIN32
  56. //! Diese Funktion wird fon der Thread Klasse benutzt um einen thread zu starten
  57. DLLEXPORT unsigned long __stdcall threadStart( void *param );
  58. #else
  59. //! Diese Funktion wird fon der Thread Klasse benutzt um einen thread zu starten
  60. void *threadStart( void *param ); //! startet thread
  61. #endif
  62. //! Eine Klasse, die alle aktuell laufenden Thread Objekte speichert
  63. class ThreadRegister
  64. {
  65. private:
  66. Array< Thread* > threads;
  67. CRITICAL_SECTION cs;
  68. Array< pthread_t > closedThreads;
  69. public:
  70. //! Konstruktor
  71. ThreadRegister();
  72. //! Destruktor
  73. ~ThreadRegister();
  74. //! Fügt einen neuen Thread hinzu
  75. //! \param t Der Thread, der hinzugefügt werden soll
  76. void add( Thread *t );
  77. //! Entfernt einen neuen Thread
  78. //! \param t Der Thread, der entfernt werden soll
  79. void remove( Thread *t );
  80. //! Überprüft, ob ein Zeiger auf ein gültiges Thread Objekt zeigt, oder ob es schon gelöscht wurde
  81. //! \param t Der Zeiger, der geprüft werden soll
  82. bool isThread( Thread *t );
  83. //! Sucht nach einem bestimmten Thread und gibt das zugehörige Objekt zurück
  84. //! handle: Ein handle zu dem gesuchten Thread
  85. Thread *zThread( pthread_t handle );
  86. //! Setzt Wird automatisch aufgerufen, wenn ein Thread beendet wird. Die Reccourcen werden daraufhin in cleanUpClosedThreads freigegeben.
  87. //! \param handle Das Handle des Threads
  88. void addClosedThread( pthread_t handle );
  89. //! sperrt das register
  90. void lock();
  91. //! entsperrt das register
  92. void unlock();
  93. //! Löscht die bereits beendetetn Threads und gibt ihre Reccourcen wieder frei
  94. DLLEXPORT void cleanUpClosedThreads();
  95. };
  96. }
  97. #endif