反应器的 schedule_timer 函数用来设定一个定时事件,当时间到达时回调事件处理器的 handle_timeout 处理函数。
schedule_timer 的原型如下:
schedule_timer (ACE_Event_Handler *event_handler, const void *arg, const ACE_Time_Value &delay, const ACE_Time_Value &interval=ACE_Time_Value::zero)
参数说明:
- event_handler :事件处理器指针
- arg :传递给 handle_timeout 的参数
- delay :延迟多久后定时器开始启动
- interval :定时器继续触发的时间间隔,如果采用默认值,则表示定时器只在延迟后触发一次
- 返回值为一个唯一的 timer_id ,该只可用于 cancel_timer 取消一个定时器,注意, cancel_timer 会回调处理器的 handle_close 函数
handle_timeout 的原型如下:
int handle_timeout (const ACE_Time_Value ¤t_time, const void *act=0)
参数说明:
- current_time :当前回调该处理函数的时间。要该参数是因为系统本身有时延,这个值和定时器本该触发的时间有一定的误差。
- act :为 handle_timeout 的 arg ,注意,要考虑 act 的作用域(在调用 schedule_timer 时 arg 的作用域是否在调用反应器的 run_event_loop() 时仍然有效)
例子代码如下:
#include <iostream>
#include <ace/Event_Handler.h>
#include <ace/Reactor.h>
class Timer:public ACE_Event_Handler
{
public:
int handle_timeout(const ACE_Time_Value ¤t_time, const void *act=0)
{
char *p = (char*) act;
std::cout << "time out:";
if (p)
std::cout << p;
std::cout << std::endl;
}
Timer(int delay,int interval,const void *arg = 0)
{
ACE_Time_Value t1(delay);
ACE_Time_Value t2(interval);
timer_id_ = ACE_Reactor::instance()->schedule_timer(this,arg,t1,t2);
}
private:
long timer_id_;
};
int main(int argc, char* argv[])
{
Timer t(3,1,"hahahha");
ACE_Reactor::instance()->run_event_loop();
return 0;
}