Libevent | 定时器
libevent 实现定时器流程
首先初始化libevent库,并保存返回的指针
struct event_base * base = event_init();
实际上这一步相当于初始化一个Reactor实例;在初始化libevent后,就可以注册事件了。
初始化事件event,设置回调函数和关注的事件 ,事实上这等价于调用event_set(&ev, -1, 0, timer_cb, NULL);
evtimer_set(&ev, timer_cb, NULL);
设置event从属的event_base ,这一步相当于指明event要注册到哪个event_base实例上;
event_base_set(base, &ev);
是正式的添加事件的时候了
event_add(&ev, timeout);
基本信息都已设置完成,只要简单的调用event_add()函数即可完成,其中timeout是定时值;
这一步相当于调用Reactor::register_handler()函数注册事件。
程序进入无限循环,等待就绪事件并执行事件处理
event_base_dispatch(base);
完整的示例代码
#include <iostream>
#include "event.h"
struct timeval tv;
struct event ev;
static void time_cb(evutil_socket_t fd, short event, void* arg)
{
std::cout << "timer wakeup" << std::endl;
event_add(&ev, &tv); // reschedule timer
}
int main()
{
struct event_base* base = event_base_new();
tv.tv_sec = 2;
tv.tv_usec = 0;
// event *timeout = event_new(base, -1, EV_PERSIST|EV_TIMEOUT, time_cb, NULL);
evtimer_set(&ev, time_cb, nullptr);
event_base_set(base, &ev);
event_add(&ev, &tv);
event_base_dispatch(base);
return 1;
}
libevent实现定时器的第二种方法
定义一个定时器事件,使用event_new()创建了一个定时器事件.替换上述的步骤2和3
struct event *event_new(struct event_base *, evutil_socket_t, short, event_callback_fn, void *);
完整示例代码
#include <iostream>
#include "event.h"
struct timeval tv;
struct event ev;
static void time_cb(evutil_socket_t fd, short event, void* arg)
{
std::cout << "timer wakeup" << std::endl;
}
int main()
{
struct event_base* base = event_base_new();
tv.tv_sec = 2;
tv.tv_usec = 0;
event* ev = event_new(base, -1, EV_PERSIST|EV_TIMEOUT, time_cb, NULL);
event_add(ev, &tv);
event_base_dispatch(base);
return 1;
}
--完--
- 原文作者: 留白
- 原文链接: https://zfunnily.github.io/2020/09/libeventimer/
- 更新时间:2024-04-16 01:01:05
- 本文声明:转载请标记原文作者及链接