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>
|
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
|
||||||
|
|||||||
@ -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()
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user