Browse Source

定时器事件demo

master
adminPyf 3 years ago
parent
commit
066164e742
2 changed files with 82 additions and 0 deletions
  1. +2
    -0
      test_timer/makefile
  2. +80
    -0
      test_timer/test_timer.cpp

+ 2
- 0
test_timer/makefile View File

@ -0,0 +1,2 @@
test_timer:test_timer.cpp
g++ $^ -o $@ -levent

+ 80
- 0
test_timer/test_timer.cpp View File

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

Loading…
Cancel
Save