From 1ca4e2bc3f03a65fc296f17b38ee2e49eb0e0b4e Mon Sep 17 00:00:00 2001 From: kiritow <1362050620@qq.com> Date: Sat, 1 Jul 2017 20:34:34 +0800 Subject: [PATCH] Update Event Loop to do-while style --- MiniEngine_Event.cpp | 107 ++++++++++++++++++++++--------------------- MiniEngine_Event.h | 1 - 2 files changed, 56 insertions(+), 52 deletions(-) diff --git a/MiniEngine_Event.cpp b/MiniEngine_Event.cpp index 14bd876..671b02a 100644 --- a/MiniEngine_Event.cpp +++ b/MiniEngine_Event.cpp @@ -67,22 +67,22 @@ Looper::Looper() LooperID Looper::add(_SDLEventType_ event_type,const std::function& event_callback) { _evmap[event_type].push_front(std::make_pair(_loop_cnt,event_callback)); - return _getNextID(event_type); + return _getNextID(event_type); } LooperID Looper::add(_SDLEventType_ event_type,const std::function& event_callback) { _evmap[event_type].push_front(std::make_pair(_loop_cnt,[=](Looper& lp,Event& ev)->int{return event_callback(ev);})); - return _getNextID(event_type); + return _getNextID(event_type); } LooperID Looper::add(_SDLEventType_ event_type,const std::function& event_callback) { _evmap[event_type].push_front(std::make_pair(_loop_cnt,[=](Looper& lp,Event& ev)->int{return event_callback(lp);})); - return _getNextID(event_type); + return _getNextID(event_type); } LooperID Looper::add(_SDLEventType_ event_type,const std::function& event_callback) { _evmap[event_type].push_front(std::make_pair(_loop_cnt,[=](Looper& lp,Event& ev)->int{return event_callback();})); - return _getNextID(event_type); + return _getNextID(event_type); } LooperID Looper::add(_SDLEventType_ event_type,const std::function& event_callback) @@ -99,7 +99,7 @@ LooperID Looper::add(_SDLEventType_ event_type,const std::function& event_callback) { - return add(event_type,std::function([=](Looper& lp,Event& ev)->int{event_callback();return 0;})); + return add(event_type,std::function([=](Looper& lp,Event& ev)->int{event_callback(); return 0;})); } LooperID Looper::operator + (const std::pair<_SDLEventType_,std::function>& event_callback) @@ -140,10 +140,10 @@ LooperID Looper::operator + (const std::pair<_SDLEventType_,std::functionfirst==looperid._looper_cnt) { @@ -169,17 +169,20 @@ void Looper::dispatch() } void Looper::run() { - while(_running) + do { + if(_update) + { + updater(); + _update=false; + } + while(!_update&&WaitEvent(_e)) { dispatch(); } - - updater(); - - _update=false; } + while(_running); } Event Looper::GetLastEvent() { @@ -189,14 +192,10 @@ void Looper::needupdate() { _update=true; } -void Looper::needstop() -{ - _running=false; -} void Looper::stop() { - needstop(); - needupdate(); + _running=false; + _update=true; } void Looper::reset() { @@ -209,30 +208,37 @@ void Looper::reset() LooperID Looper::_getNextID(const _SDLEventType_& event_type) { - LooperID id; - id._looper_cnt = _loop_cnt; - id._type_id = event_type; + LooperID id; + id._looper_cnt = _loop_cnt; + id._type_id = event_type; - ++_loop_cnt; - return id; + ++_loop_cnt; + return id; } Poller::Poller() { - idler=[](){}; + idler=[]() {}; } void Poller::reset() { Looper::reset(); - idler=[](){}; + idler=[]() {}; } void Poller::run() { int pollret=1; - while(_running) + + do { + if(_update) + { + updater(); + _update=false; + } + while(!_update&&(pollret=PollEvent(_e))) { dispatch(); @@ -240,47 +246,46 @@ void Poller::run() /// If pollret is not 0 (new event requests update), or pollret is 0 (No New Event) but Idle function requests update, then call updater. if(!pollret) idler(); - if(_update) - { - updater(); - _update=false; - } + } + while(_running); } LooperWithTime::LooperWithTime(int Timeout_ms) { - _timeout_ms = Timeout_ms; + _timeout_ms = Timeout_ms; } void LooperWithTime::setTimeout(int ms) { - _timeout_ms = ms; + _timeout_ms = ms; } int LooperWithTime::getTimeout() const { - return _timeout_ms; + return _timeout_ms; } void LooperWithTime::run() { - int timeret = 1; - while (_running) - { - while (!_update&&(timeret=WaitEventTimeout(_e, _timeout_ms))) - { - dispatch(); - } + int timeret = 1; + do + { + if (_update) + { + updater(); + _update = false; + } - /// If timeret is not 0 (new event request update), or timeret is 0 (Time out) but Idle function requests update, then call updater. - if (!timeret) idler(); - if (_update) - { - updater(); - _update = false; - } - } + while (!_update&&(timeret=WaitEventTimeout(_e, _timeout_ms))) + { + dispatch(); + } + + /// If timeret is not 0 (new event request update), or timeret is 0 (Time out) but Idle function requests update, then call updater. + if (!timeret) idler(); + } + while (_running); } }/// End of namespace MiniEngine diff --git a/MiniEngine_Event.h b/MiniEngine_Event.h index 8b0c8fb..e329f32 100644 --- a/MiniEngine_Event.h +++ b/MiniEngine_Event.h @@ -66,7 +66,6 @@ public: void run(); Event GetLastEvent(); void needupdate(); - void needstop(); void stop(); void reset();