X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=simgear%2Fstructure%2Fevent_mgr.cxx;h=63e4672faaeb0a95212cb39760af5925dc050619;hb=f3c131ffaf04d8e04595c1271f8a70c8a9d89f5f;hp=d4b573d00e84ea674529f5b22c32dac8401f8d37;hpb=9cbbe5559844317f44744788ddb308101a1e75e9;p=simgear.git diff --git a/simgear/structure/event_mgr.cxx b/simgear/structure/event_mgr.cxx index d4b573d0..63e4672f 100644 --- a/simgear/structure/event_mgr.cxx +++ b/simgear/structure/event_mgr.cxx @@ -1,8 +1,9 @@ #include "event_mgr.hxx" #include +#include -void SGEventMgr::add(SGCallback* cb, +void SGEventMgr::add(const std::string& name, SGCallback* cb, double interval, double delay, bool repeat, bool simtime) { @@ -13,26 +14,23 @@ void SGEventMgr::add(SGCallback* cb, SGTimer* t = new SGTimer; t->interval = interval; t->callback = cb; - t->mgr = this; t->repeat = repeat; - t->simtime = simtime; - + t->name = name; + SGTimerQueue* q = simtime ? &_simQueue : &_rtQueue; q->insert(t, delay); } +SGTimer::~SGTimer() +{ + delete callback; + callback = NULL; +} + void SGTimer::run() { (*callback)(); - - if(repeat) { - SGTimerQueue* q = simtime ? &mgr->_simQueue : &mgr->_rtQueue; - q->insert(this, interval); - } else { - delete callback; - delete this; - } } void SGEventMgr::update(double delta_time_sec) @@ -43,6 +41,21 @@ void SGEventMgr::update(double delta_time_sec) _rtQueue.update(rt); } +void SGEventMgr::removeTask(const std::string& name) +{ + SGTimer* t = _simQueue.findByName(name); + if (t) { + _simQueue.remove(t); + } else if ((t = _rtQueue.findByName(name))) { + _rtQueue.remove(t); + } else { + SG_LOG(SG_GENERAL, SG_WARN, "removeTask: no task found with name:" << name); + return; + } + + delete t; +} + //////////////////////////////////////////////////////////////////////// // SGTimerQueue // This is the priority queue implementation: @@ -82,6 +95,11 @@ void SGTimerQueue::update(double deltaSecs) while(_numEntries && nextTime() <= _now) { SGTimer* t = remove(); t->run(); + if(t->repeat) { + insert(t, t->interval); + } else { + delete t; + } } } @@ -165,3 +183,14 @@ void SGTimerQueue::growArray() delete[] _table; _table = newTable; } + +SGTimer* SGTimerQueue::findByName(const std::string& name) const +{ + for (int i=0; i < _numEntries; ++i) { + if (_table[i].timer->name == name) { + return _table[i].timer; + } + } + + return NULL; +}