|
@ -0,0 +1,80 @@ |
|
|
|
|
|
#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; |
|
|
|
|
|
|
|
|
|
|
|
} |