improve the timer that it can be deleted in elapse handler

This commit is contained in:
Jinhao 2019-09-01 18:49:19 +08:00
parent e37cc5ec37
commit 8323064efc
2 changed files with 13 additions and 9 deletions

View File

@ -48,7 +48,7 @@ namespace nana
template<typename Function> template<typename Function>
void elapse(Function && fn) void elapse(Function && fn)
{ {
elapse_.connect(std::forward<Function>(fn)); elapse_->connect(std::forward<Function>(fn));
} }
void reset(); void reset();
@ -66,7 +66,7 @@ namespace nana
private: private:
unsigned _m_interval() const; unsigned _m_interval() const;
private: private:
nana::basic_event<arg_elapse> elapse_; std::shared_ptr<nana::basic_event<arg_elapse>> elapse_;
implement * const impl_; implement * const impl_;
}; };
}//end namespace nana }//end namespace nana

View File

@ -111,13 +111,13 @@ namespace nana
{ {
public: public:
#if defined(NANA_WINDOWS) #if defined(NANA_WINDOWS)
timer_core(timer* sender, timer_identifier tmid, basic_event<arg_elapse>& evt_elapse): timer_core(timer* sender, timer_identifier tmid, std::shared_ptr<basic_event<arg_elapse>> evt_elapse):
sender_(sender), sender_(sender),
timer_(tmid), timer_(tmid),
evt_elapse_(evt_elapse) evt_elapse_(evt_elapse)
{} {}
#else #else
timer_core(timer* sender, basic_event<arg_elapse>& evt_elapse): timer_core(timer* sender, std::shared_ptr<basic_event<arg_elapse>> evt_elapse):
sender_(sender), sender_(sender),
timer_(this), timer_(this),
evt_elapse_(evt_elapse) evt_elapse_(evt_elapse)
@ -142,12 +142,15 @@ namespace nana
{ {
arg_elapse arg; arg_elapse arg;
arg.sender = sender_; 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: private:
timer * const sender_; timer * const sender_;
const timer_identifier timer_; const timer_identifier timer_;
nana::basic_event<arg_elapse> & evt_elapse_; std::shared_ptr<nana::basic_event<arg_elapse>> evt_elapse_;
}; //end class timer_core }; //end class timer_core
@ -175,8 +178,9 @@ namespace nana
}; };
//class timer //class timer
timer::timer() timer::timer():
: impl_(new implement) elapse_(std::make_shared<nana::basic_event<arg_elapse>>()),
impl_(new implement)
{ {
} }
@ -195,7 +199,7 @@ namespace nana
void timer::reset() void timer::reset()
{ {
stop(); stop();
elapse_.clear(); elapse_->clear();
} }
void timer::start() void timer::start()