RenderThread.cpp 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. #include "RenderThread.h"
  2. #include "Bildschirm.h"
  3. #include "Zeit.h"
  4. using namespace Framework;
  5. // Inhalt der RenderTh Klasse aus RenderThread.h
  6. // Konstruktor
  7. RenderTh::RenderTh()
  8. : stoppen( 0 ),
  9. bildschirm( 0 ),
  10. zeit( new ZeitMesser() ),
  11. renderTickZeit( 1 / 60 ),
  12. renderParameter( 0 ),
  13. tickParameter( 0 ),
  14. renderFunktion( 0 ),
  15. tickFunktion( 0 ),
  16. pause( 0 ),
  17. maxFps( 30 ),
  18. ref( 1 )
  19. {
  20. InitializeCriticalSection( &cs );
  21. }
  22. // Destruktor
  23. RenderTh::~RenderTh()
  24. {
  25. if( run )
  26. beenden();
  27. if( bildschirm )
  28. bildschirm->release();
  29. zeit->release();
  30. DeleteCriticalSection( &cs );
  31. }
  32. // nicht constant
  33. void RenderTh::lock()
  34. {
  35. EnterCriticalSection( &cs );
  36. }
  37. void RenderTh::unlock()
  38. {
  39. LeaveCriticalSection( &cs );
  40. }
  41. void RenderTh::setBildschirm( Bildschirm *bildschirm ) // setzt den Bildschirm
  42. {
  43. lock();
  44. if( this->bildschirm )
  45. this->bildschirm->release();
  46. this->bildschirm = bildschirm;
  47. unlock();
  48. }
  49. void RenderTh::thread() // Render Schleife
  50. {
  51. zeit->messungStart();
  52. double ausgleich = 0;
  53. while( !stoppen )
  54. {
  55. lock();
  56. if( bildschirm && !pause )
  57. {
  58. if( renderFunktion )
  59. renderFunktion( renderParameter, this, bildschirm->zRenderBild() );
  60. bildschirm->render();
  61. if( tickFunktion )
  62. tickFunktion( tickParameter, this, renderTickZeit );
  63. bildschirm->tick( renderTickZeit );
  64. unlock();
  65. }
  66. else
  67. {
  68. unlock();
  69. Sleep( 100 );
  70. }
  71. ausgleich += 1.0 / maxFps - renderTickZeit;
  72. if( ausgleich > 0 )
  73. Sleep( (int)( ausgleich * 1000 ) );
  74. zeit->messungEnde();
  75. zeit->messungStart();
  76. renderTickZeit = zeit->getSekunden();
  77. }
  78. zeit->messungEnde();
  79. }
  80. void RenderTh::beginn() // beginnt rendering
  81. {
  82. stoppen = 0;
  83. start();
  84. }
  85. void RenderTh::beenden() // beendet den Thread
  86. {
  87. stoppen = 1;
  88. warteAufThread( 2000 );
  89. if( run )
  90. ende();
  91. }
  92. void RenderTh::setMaxFps( int fps ) // setzt die Anzahl der Bilder pro Sekunde
  93. {
  94. maxFps = fps;
  95. }
  96. void RenderTh::setPause( bool p ) // Renderpause
  97. {
  98. pause = p;
  99. }
  100. void RenderTh::setRenderFunktion( void( *rF )( void *, void *, Bild * ) ) // setzt die Rückruf Funktion beim Rendern
  101. {
  102. renderFunktion = rF;
  103. }
  104. void RenderTh::setTickFunktion( void( *tF )( void *, void *, double ) ) // setzt die Rückruf Funktion beim Tick
  105. {
  106. tickFunktion = tF;
  107. }
  108. void RenderTh::setRenderFunktionParameter( void *p ) // setzt den Parameter der Rückruf Funktion beim Rendern
  109. {
  110. renderParameter = p;
  111. }
  112. void RenderTh::setTickFunktionParameter( void *p ) // setzt den Parameter der Rückruf Funktion beim Tick
  113. {
  114. tickParameter = p;
  115. }
  116. // constant
  117. Bildschirm *RenderTh::getBildschirm() const // gibt den Bildschirm zurück
  118. {
  119. return bildschirm ? bildschirm->getThis() : 0;
  120. }
  121. Bildschirm *RenderTh::zBildschirm() const
  122. {
  123. return bildschirm;
  124. }
  125. double RenderTh::getRenderTickZeit() const // gibt die Zeit zurück, die zum Rendern und zum Tick benötigt wird
  126. {
  127. return renderTickZeit;
  128. }
  129. // Reference Counting
  130. RenderTh *RenderTh::getThis()
  131. {
  132. ++ref;
  133. return this;
  134. }
  135. RenderTh *RenderTh::release()
  136. {
  137. --ref;
  138. if( !ref )
  139. delete this;
  140. return 0;
  141. }