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

来源:互联网 发布:淘宝怎么看上架的时间 编辑:程序博客网 时间:2024/05/01 13:17
转载于: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\n"),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("\n%d\n",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 }

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

0 0
原创粉丝点击