#include <iostream>
#include <time.h>
#include <event2/event.h>
using namespace std;
static struct timeval tv = {1, 0};
static void TIMER_CB(int sock, short which, void* arg)
{
cout<<"TIMER"<<endl;
//只添加一次,非持久性,若想持久性,需从新add
event* ev = (event*)arg;
//若是非待决状态
if (!evtimer_pending(ev, &tv))
{
evtimer_del(ev);
evtimer_add(ev, &tv);
}
}
static void TIMER_CB1(int sock, short which, void* arg)
{
cout<<"TIMER1"<<endl;
}
static void TIMER_CB2(int sock, short which, void* arg)
{
cout<<"TIMER2"<<endl;
}
int main()
{
event_base* pevbase = event_base_new();
if (!pevbase)
{
cerr<<"event_base_new error"<<endl;
return -1;
}
//和evsignal不一样有默认持久性属性,evtimer_new是非持久性事件
event* pevtm = evtimer_new(pevbase, TIMER_CB, event_self_cbarg());
if (!pevtm)
{
cerr<<"evtimer_new error"<<endl;
return -1;
}
evtimer_add(pevtm, &tv); //插入性能O(logn)
//也可以使用event_new函数对事件进行持久性
event* pevtm1 = event_new(pevbase, -1, EV_PERSIST, TIMER_CB1, event_self_cbarg());
if (!pevtm1)
{
cerr<<"event_new error"<<endl;
return -1;
}
evtimer_add(pevtm1, &tv);
//超时性能优化,定时器event默认存储方式是二叉树,插入删除o(logn)
//优化到双向队列,插入删除o(1)
event* pevtm2 = event_new(pevbase, -1, EV_PERSIST, TIMER_CB2, event_self_cbarg());
if (!pevtm2)
{
cerr<<"event_new error"<<endl;
return -1;
}
static struct timeval tv1= {1, 0};
const struct timeval *ptv = event_base_init_common_timeout(pevbase, &tv1);
event_add(pevtm2, ptv); //插入性能O(1)
event_base_dispatch(pevbase);
event_base_free(pevbase);
return 0;
}
libevent timer事件使用
最新推荐文章于 2023-07-02 12:21:49 发布