#include <iostream>
|
|
#include <event2/event.h>
|
|
#include <string.h>
|
|
#include <thread>
|
|
#ifdef _WIN32
|
|
|
|
#else
|
|
#include <signal.h>
|
|
#endif // !_WIN32
|
|
|
|
using namespace std;
|
|
static timeval t1 = {1,0};
|
|
void timer1(int sock,short which, void *arg){
|
|
cout << "[timer1]" << flush;
|
|
event* ev = (event*)arg;
|
|
if(!evtimer_pending(ev,&t1) ){
|
|
evtimer_del(ev);
|
|
evtimer_add(ev,&t1);
|
|
}
|
|
}
|
|
|
|
void timer2(int sock,short which, void *arg){
|
|
cout << "[timer2]" << flush;
|
|
this_thread::sleep_for(3000ms); //c++ 11
|
|
}
|
|
void timer3(int sock,short which, void *arg){
|
|
cout << "[timer3]" << flush;
|
|
}
|
|
|
|
int main(int agrc,char** agrv){
|
|
#ifdef _WIN32
|
|
//初始化socket库
|
|
WSADATA wsa;
|
|
WSAStartup(MAKEWORD(2, 2), &wsa);
|
|
#else
|
|
if (signal(SIGPIPE, SIG_IGN) == SIG_ERR) { //忽略管道信号,发送数据给已关闭的socket,会飞掉!
|
|
return 1;
|
|
}
|
|
#endif
|
|
|
|
event_base *base = event_base_new();
|
|
|
|
//定时器
|
|
cout << "test timer" << endl;
|
|
|
|
//非持久定时器 只进入一次
|
|
event* evl = evtimer_new(base ,timer1,event_self_cbarg());
|
|
if(evl == NULL){
|
|
cout << "evtimer_new timer1 failed!" <<endl;
|
|
return -1;
|
|
}
|
|
evtimer_add(evl,&t1);
|
|
|
|
|
|
static timeval t2;
|
|
t2.tv_sec = 1;
|
|
t2.tv_usec = 200000; //微秒
|
|
event *ev2 = event_new(base,-1,EV_PERSIST,timer2,0);
|
|
event_add(ev2,&t2);
|
|
|
|
|
|
//超时性能优化,默认event用二叉堆存储,插入删除 时间复杂度为O(logN)
|
|
//优化到双向队列 插入删除O(1)
|
|
event *ev3 = event_new(base,-1,EV_PERSIST,timer3,0);
|
|
static timeval tv_in = {3,0};
|
|
const timeval * t3;
|
|
t3 = event_base_init_common_timeout(base,&tv_in);
|
|
event_add(ev3,t3);
|
|
|
|
//进入事件主循环
|
|
event_base_dispatch(base);
|
|
|
|
event_free(evl);
|
|
event_free(ev2);
|
|
|
|
event_base_free(base);
|
|
|
|
return 0;
|
|
|
|
}
|