improve the timer that it can be deleted in elapse handler
This commit is contained in:
parent
e37cc5ec37
commit
8323064efc
@ -48,7 +48,7 @@ namespace nana
|
||||
template<typename Function>
|
||||
void elapse(Function && fn)
|
||||
{
|
||||
elapse_.connect(std::forward<Function>(fn));
|
||||
elapse_->connect(std::forward<Function>(fn));
|
||||
}
|
||||
|
||||
void reset();
|
||||
@ -66,7 +66,7 @@ namespace nana
|
||||
private:
|
||||
unsigned _m_interval() const;
|
||||
private:
|
||||
nana::basic_event<arg_elapse> elapse_;
|
||||
std::shared_ptr<nana::basic_event<arg_elapse>> elapse_;
|
||||
implement * const impl_;
|
||||
};
|
||||
}//end namespace nana
|
||||
|
||||
@ -111,13 +111,13 @@ namespace nana
|
||||
{
|
||||
public:
|
||||
#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),
|
||||
timer_(tmid),
|
||||
evt_elapse_(evt_elapse)
|
||||
{}
|
||||
#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),
|
||||
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<arg_elapse> & evt_elapse_;
|
||||
std::shared_ptr<nana::basic_event<arg_elapse>> 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<nana::basic_event<arg_elapse>>()),
|
||||
impl_(new implement)
|
||||
{
|
||||
}
|
||||
|
||||
@ -195,7 +199,7 @@ namespace nana
|
||||
void timer::reset()
|
||||
{
|
||||
stop();
|
||||
elapse_.clear();
|
||||
elapse_->clear();
|
||||
}
|
||||
|
||||
void timer::start()
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user