Thread.h 3.8 KB

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