转载于:http://www.cnblogs.com/TianFang/archive/2006/12/18/596012.html
定时器的实现
通过Reactor机制,还可以很容易的实现定时器的功能,使用方式如下。
-
编写一个事件反应器,重载handle_timeout()方法,该方法是定时器的触发时间到时,会自动触发该方法。
-
通过Reactor的schedule_timer()方法注册定时器。
-
启动reacotr的handle_events()事件分发循环。
-
当不想使用定时器时,可以通过Reactor的cancel_timer()方法注销定时器。
下面的代码简单的实现了一个定时器,并具有基本的开启,关闭功能。
1 #include <ace/OS.h> 2 #include <ace/Reactor.h> 3 4 class MyTimerHandler : public ACE_Event_Handler 5 { 6 private: 7 int inteval; //执行时间间隔 8 int delay; //延迟执行时间 9 int timerid; 10 11 public: 12 MyTimerHandler(int delay,int inteval) 13 { 14 this->delay=delay; 15 this->inteval=inteval; 16 } 17 18 int open() //注册定时器 19 { 20 ACE_Time_Value delaytime(inteval); 21 ACE_Time_Value intevaltime(inteval); 22 timerid = reactor()->schedule_timer(this, 23 0, //传递handle_timeout给的参数 24 delaytime, 25 intevaltime); 26 return timerid; 27 } 28 29 int close() //取消定时器 30 { 31 return reactor()->cancel_timer(timerid); 32 } 33 34 //定时器回调函数 35 int handle_timeout (const ACE_Time_Value ¤t_time, 36 const void * = 0) 37 { 38 time_t epoch = ((timespec_t)current_time).tv_sec; 39 ACE_DEBUG ((LM_INFO, 40 ACE_TEXT ("handle_timeout: %s "), 41 ACE_OS::ctime (&epoch))); 42 return 0; 43 } 44 }; 45 46 int main(int argc, char *argv[]) 47 { 48 MyTimerHandler * timer = new MyTimerHandler (3,5); 49 timer->reactor(ACE_Reactor::instance()); 50 timer->open(); 51 52 for(int i=0;i<2;i++) //触发次handle_timeout事件 53 { 54 ACE_OS::printf(" %d ",i); 55 ACE_Reactor::instance()->handle_events(); 56 } 57 58 timer->close(); 59 ACE_OS::printf("cancel timer"); 60 while(true) 61 ACE_Reactor::instance()->handle_events(); 62 return 0; 63 }
代码功能比较简单,这里就不多做介绍了。