123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216 |
- #include "EditorKarte.h"
- using namespace Editor;
- KarteDaten::KarteDaten( EditorKlient *client )
- : Thread()
- {
- this->client = client;
- sts = new SpielerTeamStruktur();
- client->loadSpieler( spieler );
- client->loadTeams( teams );
- client->loadObjekte( objekte );
- exit = 0;
- start();
- }
- KarteDaten::~KarteDaten()
- {
- cs.lock();
- for( auto i = objekte.getIterator(); i; i++ )
- delete i._;
- for( auto i = spieler.getIterator(); i; i++ )
- delete i._;
- for( auto i = teams.getIterator(); i; i++ )
- delete i._;
- sts->release();
- client->release();
- }
- void KarteDaten::addObjekt( ObjektDaten &daten )
- {
- ObjektDaten *nd = new ObjektDaten( daten );
- cs.lock();
- nd->id = objekte.getEintragAnzahl();
- objekte.add( nd );
- ObjektDaten td = *nd;
- EditorKlient *c = client;
- aktionen.add( [ td, c ]()
- {
- c->saveObjekt( &td );
- } );
- cs.unlock();
- }
- void KarteDaten::removeObjekt( int index )
- {
- cs.lock();
- int id = objekte.get( index )->id;
- delete objekte.get( index );
- objekte.remove( index );
- EditorKlient *c = client;
- aktionen.add( [ id, c ]()
- {
- c->deleteObjekt( id );
- } );
- cs.unlock();
- }
- void KarteDaten::getObjekt( int index, std::function< bool( ObjektDaten* ) > callBack )
- {
- cs.lock();
- if( callBack( objekte.get( index ) ) )
- {
- ObjektDaten td = *objekte.get( index );
- EditorKlient *c = client;
- aktionen.add( [ td, c ]()
- {
- c->saveObjekt( &td );
- } );
- }
- cs.unlock();
- }
- void KarteDaten::getSpieler( int index, std::function< bool( SpielerDaten* ) > callBack )
- {
- cs.lock();
- if( callBack( spieler.get( index ) ) )
- {
- SpielerDaten td = *spieler.get( index );
- EditorKlient *c = client;
- aktionen.add( [ td, c ]()
- {
- c->saveSpieler( &td );
- } );
- }
- cs.unlock();
- }
- void KarteDaten::getTeam( int index, std::function< bool( TeamDaten* ) > callBack )
- {
- cs.lock();
- if( callBack( teams.get( index ) ) )
- {
- TeamDaten td = *teams.get( index );
- EditorKlient *c = client;
- aktionen.add( [ td, c ](){
- c->saveTeam( &td );
- } );
- }
- cs.unlock();
- }
- void KarteDaten::thread()
- {
- while( !exit )
- {
- cs.lock();
- while( hasAktions() )
- {
- std::function< void() > ak = aktionen.get( 0 );
- cs.unlock();
- ak();
- cs.lock();
- aktionen.remove( 0 );
- }
- cs.unlock();
- Sleep( 100 );
- }
- }
- const ObjektDaten *KarteDaten::getObjekt( int index )
- {
- ObjektDaten *ret = 0;
- cs.lock();
- ret = objekte.get( index );
- cs.unlock();
- return ret;
- }
- const SpielerDaten *KarteDaten::getSpieler( int index )
- {
- SpielerDaten *ret = 0;
- cs.lock();
- ret = spieler.get( index );
- cs.unlock();
- return ret;
- }
- const TeamDaten *KarteDaten::getTeam( int index )
- {
- TeamDaten *ret = 0;
- cs.lock();
- ret = teams.get( index );
- cs.unlock();
- return ret;
- }
- int KarteDaten::getSpielerIndexById( int id )
- {
- int index = 0;
- cs.lock();
- for( auto i = spieler.getIterator(); i; i++ )
- {
- if( i->id == id )
- break;
- index++;
- }
- cs.unlock();
- return index;
- }
- int KarteDaten::getSpielerAnzahl() const
- {
- return spieler.getEintragAnzahl();
- }
- int KarteDaten::getTeamIndexById( int id )
- {
- int index = 0;
- cs.lock();
- for( auto i = teams.getIterator(); i; i++ )
- {
- if( i->id == id )
- break;
- index++;
- }
- cs.unlock();
- return index;
- }
- int KarteDaten::getTeamAnzahl() const
- {
- return teams.getEintragAnzahl();
- }
- int KarteDaten::getObjektAnzahl() const
- {
- return objekte.getEintragAnzahl();
- }
- bool KarteDaten::hasError() const
- {
- return !error.istGleich( "" );
- }
- char *KarteDaten::getError() const
- {
- return error;
- }
- bool KarteDaten::hasAktions() const
- {
- return aktionen.getEintragAnzahl() > 0;
- }
- // löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
- Thread *KarteDaten::release()
- {
- if( ref == 2 && run )
- {
- exit = 1;
- if( isRunning() )
- warteAufThread( INT_MAX );
- }
- return Thread::release();
- }
|