ACE反应器(Reactor)模式(4)

转载于:http://www.cnblogs.com/TianFang/archive/2006/12/18/596012.html

定时器的实现

通过Reactor机制,还可以很容易的实现定时器的功能,使用方式如下。

  1. 编写一个事件反应器,重载handle_timeout()方法,该方法是定时器的触发时间到时,会自动触发该方法。
  2. 通过Reactor的schedule_timer()方法注册定时器。
  3. 启动reacotr的handle_events()事件分发循环。
  4. 当不想使用定时器时,可以通过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 &current_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 }

代码功能比较简单,这里就不多做介绍了。

原文地址:https://www.cnblogs.com/shmilxu/p/4860530.html