From 8323064efceb2ac581983d569ee96fa39f5d6a80 Mon Sep 17 00:00:00 2001 From: Jinhao Date: Sun, 1 Sep 2019 18:49:19 +0800 Subject: [PATCH] improve the timer that it can be deleted in elapse handler --- include/nana/gui/timer.hpp | 4 ++-- source/gui/timer.cpp | 18 +++++++++++------- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/include/nana/gui/timer.hpp b/include/nana/gui/timer.hpp index c360884b..0f28116e 100644 --- a/include/nana/gui/timer.hpp +++ b/include/nana/gui/timer.hpp @@ -48,7 +48,7 @@ namespace nana template void elapse(Function && fn) { - elapse_.connect(std::forward(fn)); + elapse_->connect(std::forward(fn)); } void reset(); @@ -66,7 +66,7 @@ namespace nana private: unsigned _m_interval() const; private: - nana::basic_event elapse_; + std::shared_ptr> elapse_; implement * const impl_; }; }//end namespace nana diff --git a/source/gui/timer.cpp b/source/gui/timer.cpp index 8374a5fb..5e0e75bb 100644 --- a/source/gui/timer.cpp +++ b/source/gui/timer.cpp @@ -111,13 +111,13 @@ namespace nana { public: #if defined(NANA_WINDOWS) - timer_core(timer* sender, timer_identifier tmid, basic_event& evt_elapse): + timer_core(timer* sender, timer_identifier tmid, std::shared_ptr> evt_elapse): sender_(sender), timer_(tmid), evt_elapse_(evt_elapse) {} #else - timer_core(timer* sender, basic_event& evt_elapse): + timer_core(timer* sender, std::shared_ptr> evt_elapse): sender_(sender), timer_(this), evt_elapse_(evt_elapse) @@ -142,12 +142,15 @@ namespace nana { arg_elapse arg; arg.sender = sender_; - evt_elapse_.emit(arg, nullptr); + + //retain the object to avoid it to be deleted during calling of emit + auto retain = evt_elapse_; + retain->emit(arg, nullptr); } private: timer * const sender_; const timer_identifier timer_; - nana::basic_event & evt_elapse_; + std::shared_ptr> evt_elapse_; }; //end class timer_core @@ -175,8 +178,9 @@ namespace nana }; //class timer - timer::timer() - : impl_(new implement) + timer::timer(): + elapse_(std::make_shared>()), + impl_(new implement) { } @@ -195,7 +199,7 @@ namespace nana void timer::reset() { stop(); - elapse_.clear(); + elapse_->clear(); } void timer::start()