|
|
- #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;
-
- }
|