EditorKarte.cpp 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. #include "EditorKarte.h"
  2. using namespace Editor;
  3. KarteDaten::KarteDaten( EditorKlient *client )
  4. : Thread()
  5. {
  6. this->client = client;
  7. sts = new SpielerTeamStruktur();
  8. client->loadSpieler( spieler );
  9. client->loadTeams( teams );
  10. client->loadObjekte( objekte );
  11. exit = 0;
  12. start();
  13. }
  14. KarteDaten::~KarteDaten()
  15. {
  16. cs.lock();
  17. for( auto i = objekte.getIterator(); i; i++ )
  18. delete i._;
  19. for( auto i = spieler.getIterator(); i; i++ )
  20. delete i._;
  21. for( auto i = teams.getIterator(); i; i++ )
  22. delete i._;
  23. sts->release();
  24. client->release();
  25. }
  26. void KarteDaten::addObjekt( ObjektDaten &daten )
  27. {
  28. ObjektDaten *nd = new ObjektDaten( daten );
  29. cs.lock();
  30. nd->id = objekte.getEintragAnzahl();
  31. objekte.add( nd );
  32. ObjektDaten td = *nd;
  33. EditorKlient *c = client;
  34. aktionen.add( [ td, c ]()
  35. {
  36. c->saveObjekt( &td );
  37. } );
  38. cs.unlock();
  39. }
  40. void KarteDaten::removeObjekt( int index )
  41. {
  42. cs.lock();
  43. int id = objekte.get( index )->id;
  44. delete objekte.get( index );
  45. objekte.remove( index );
  46. EditorKlient *c = client;
  47. aktionen.add( [ id, c ]()
  48. {
  49. c->deleteObjekt( id );
  50. } );
  51. cs.unlock();
  52. }
  53. void KarteDaten::getObjekt( int index, std::function< bool( ObjektDaten* ) > callBack )
  54. {
  55. cs.lock();
  56. if( callBack( objekte.get( index ) ) )
  57. {
  58. ObjektDaten td = *objekte.get( index );
  59. EditorKlient *c = client;
  60. aktionen.add( [ td, c ]()
  61. {
  62. c->saveObjekt( &td );
  63. } );
  64. }
  65. cs.unlock();
  66. }
  67. void KarteDaten::getSpieler( int index, std::function< bool( SpielerDaten* ) > callBack )
  68. {
  69. cs.lock();
  70. if( callBack( spieler.get( index ) ) )
  71. {
  72. SpielerDaten td = *spieler.get( index );
  73. EditorKlient *c = client;
  74. aktionen.add( [ td, c ]()
  75. {
  76. c->saveSpieler( &td );
  77. } );
  78. }
  79. cs.unlock();
  80. }
  81. void KarteDaten::getTeam( int index, std::function< bool( TeamDaten* ) > callBack )
  82. {
  83. cs.lock();
  84. if( callBack( teams.get( index ) ) )
  85. {
  86. TeamDaten td = *teams.get( index );
  87. EditorKlient *c = client;
  88. aktionen.add( [ td, c ](){
  89. c->saveTeam( &td );
  90. } );
  91. }
  92. cs.unlock();
  93. }
  94. void KarteDaten::thread()
  95. {
  96. while( !exit )
  97. {
  98. cs.lock();
  99. while( hasAktions() )
  100. {
  101. std::function< void() > ak = aktionen.get( 0 );
  102. cs.unlock();
  103. ak();
  104. cs.lock();
  105. aktionen.remove( 0 );
  106. }
  107. cs.unlock();
  108. Sleep( 100 );
  109. }
  110. }
  111. const ObjektDaten *KarteDaten::getObjekt( int index )
  112. {
  113. ObjektDaten *ret = 0;
  114. cs.lock();
  115. ret = objekte.get( index );
  116. cs.unlock();
  117. return ret;
  118. }
  119. const SpielerDaten *KarteDaten::getSpieler( int index )
  120. {
  121. SpielerDaten *ret = 0;
  122. cs.lock();
  123. ret = spieler.get( index );
  124. cs.unlock();
  125. return ret;
  126. }
  127. const TeamDaten *KarteDaten::getTeam( int index )
  128. {
  129. TeamDaten *ret = 0;
  130. cs.lock();
  131. ret = teams.get( index );
  132. cs.unlock();
  133. return ret;
  134. }
  135. int KarteDaten::getSpielerIndexById( int id )
  136. {
  137. int index = 0;
  138. cs.lock();
  139. for( auto i = spieler.getIterator(); i; i++ )
  140. {
  141. if( i->id == id )
  142. break;
  143. index++;
  144. }
  145. cs.unlock();
  146. return index;
  147. }
  148. int KarteDaten::getSpielerAnzahl() const
  149. {
  150. return spieler.getEintragAnzahl();
  151. }
  152. int KarteDaten::getTeamIndexById( int id )
  153. {
  154. int index = 0;
  155. cs.lock();
  156. for( auto i = teams.getIterator(); i; i++ )
  157. {
  158. if( i->id == id )
  159. break;
  160. index++;
  161. }
  162. cs.unlock();
  163. return index;
  164. }
  165. int KarteDaten::getTeamAnzahl() const
  166. {
  167. return teams.getEintragAnzahl();
  168. }
  169. int KarteDaten::getObjektAnzahl() const
  170. {
  171. return objekte.getEintragAnzahl();
  172. }
  173. bool KarteDaten::hasError() const
  174. {
  175. return !error.istGleich( "" );
  176. }
  177. char *KarteDaten::getError() const
  178. {
  179. return error;
  180. }
  181. bool KarteDaten::hasAktions() const
  182. {
  183. return aktionen.getEintragAnzahl() > 0;
  184. }
  185. // löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
  186. Thread *KarteDaten::release()
  187. {
  188. if( ref == 2 && run )
  189. {
  190. exit = 1;
  191. if( isRunning() )
  192. warteAufThread( INT_MAX );
  193. }
  194. return Thread::release();
  195. }