方式一(event_new方式)
- 创建定时器事件 、连续触发
struct timeval tm;
struct event *ev;
tm.tv_sec = 1; //定时时间
tm.tv_usec = 0;
//超时事件|保持连续触发;最后一个参数为会传递到回调的arg
ev = event_new(base, -1, EV_TIMEOUT | EV_PERSIST, ev_cb,NULL);
evtimer_add(ev, &tm); //开启事件
- 回调函数
static void ev_cb(evutil_socket_t fd, short what, void *arg)
{
printf("%s\r\n",__func__); //间隔一秒打印一次
}
- 清除定时器
event_del(ev); //关闭事件
event_free(ev);//释放事件
- 关闭事件后可重新开启
event_del(ev); //关闭事件
evtimer_add(ev); //重新开启事件
方式二(event_base_once方式)
- 只触发一次超时,无需释放任何数据
struct timeval tm;
tm.tv_sec = 1;
tm.tv_usec = 0;
//第三个参数为回调中的arg
event_base_once(base, -1, EV_TIMEOUT, ev_cb,NULL, &tm);
- 回调函数
static void ev_cb(evutil_socket_t fd, short what, void *arg)
{
printf("%s\r\n",__func__); //间隔一秒打印一次
struct timeval tm;
tm.tv_sec = 1;
tm.tv_usec = 0;
event_base_once(base, -1, EV_TIMEOUT, ev_cb,NULL, &tm); //重新开始定时
}
方式三(evtimer_new方式)
- 官方定义(利用ectimer_ 快速实现定时器使用)
#define evtimer_new(base, callback, arg) \
event_new((base), -1, 0, (callback), (arg))
#define evtimer_add(ev, tv) \
event_add((ev),(tv))
#define evtimer_del(ev) \
event_del(ev)
#define evtimer_pending(ev, tv_out) \
event_pending((ev), EV_TIMEOUT, (tv_out))
- evtimer_new
创建定时器、只触发一次 - evtimer_add
添加定时器事件(开启定时器) - evtimer_del
关闭定时器(关闭后,实际上ev还存在,需要利用event_free释放) - evtimer_pending
判断事件是否被激活
event_pending函数确定给定事件是未决还是活动。如果是,并且在what参数中设置了标志EV_READ,EV_WRITE,EV_SIGNAL和EV_TIMEOUT中的任何一个,则该函数将返回该事件当前正在等待或活动的所有标志。如果提供了tv_out,并且在what中设置了EV_TIMEOUT ,并且该事件当前正在暂停或在超时时处于活动状态,则将tv_out设置为保留该事件的超时时间。