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