libevent 定时器快速使用参考。

方式一(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设置为保留该事件的超时时间。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
libevent是一个事件驱动的网络库,它提供了定时器功能来处理定时事件。libevent中有两种常用的定时器实现方式:二叉堆和双链队列。 1. 二叉堆:libevent默认使用二叉堆来实现定时器。二叉堆是一种完全二叉树结构,可以分为大根堆和小根堆。libevent使用小根堆来管理定时器事件,最近的超时时间会被放在堆顶。添加和删除定时器的时间复杂度为O(logN),其中N是定时器的数量。 2. 双链队列:双链队列是另一种定时器实现方式。它的添加和删除操作的时间复杂度为O(1)。双链队列适用于具有大量相同超时值的情况。你可以使用函数event_base_init_common_timeout来设置双链队列的超时时间。 下面是一个使用libevent创建定时器的示例: ```c #include <event2/event.h> #include <stdio.h> void timer_cb(evutil_socket_t fd, short event, void *arg) { printf("Timer callback\n"); } int main() { struct event_base *base = event_base_new(); struct event *timer_event = evtimer_new(base, timer_cb, NULL); struct timeval tv; tv.tv_sec = 1; // 设置定时器超时时间为1秒 tv.tv_usec = 0; evtimer_add(timer_event, &tv); // 添加定时器事件 event_base_dispatch(base); // 进入事件循环 event_free(timer_event); event_base_free(base); return 0; } ``` 这个示例中,我们使用event_base_new函数创建了一个事件基础结构体,然后使用evtimer_new函数创建了一个定时器事件。接着,我们设置了定时器的超时时间为1秒,并使用evtimer_add函数将定时器事件添加到事件循环中。最后,我们调用event_base_dispatch函数进入事件循环,等待定时器超时并触发回调函数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值