X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=simgear%2Fstructure%2Fevent_mgr.cxx;h=6753a38f41de7cf5b22e0b3160911cefb9441f6e;hb=58c7edfed6a848f555bb0eaa65593162b5a206ce;hp=1ada33c83abcc80190620c9416079df66f704b01;hpb=e09164e5b3596b19efc963aca677d6f4bc5a5277;p=simgear.git diff --git a/simgear/structure/event_mgr.cxx b/simgear/structure/event_mgr.cxx index 1ada33c8..6753a38f 100644 --- a/simgear/structure/event_mgr.cxx +++ b/simgear/structure/event_mgr.cxx @@ -1,16 +1,24 @@ #include "event_mgr.hxx" -void SGEventMgr::add(SGCallback* cb, +#include +#include + +void SGEventMgr::add(const std::string& name, SGCallback* cb, double interval, double delay, bool repeat, bool simtime) { + // Clamp the delay value to 1 usec, so that user code can use + // "zero" as a synonym for "next frame". + if(delay <= 0) delay = 0.000001; + 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); @@ -31,9 +39,25 @@ void SGTimer::run() void SGEventMgr::update(double delta_time_sec) { - _rtQueue.update(delta_time_sec); - if(!_freezeProp || _freezeProp->getBoolValue() == false) - _simQueue.update(delta_time_sec); + _simQueue.update(delta_time_sec); + + double rt = _rtProp ? _rtProp->getDoubleValue() : 0; + _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; } //////////////////////////////////////////////////////////////////////// @@ -158,3 +182,15 @@ 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; +} +