-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathlibeventTimerStudy.h
More file actions
91 lines (73 loc) · 1.73 KB
/
libeventTimerStudy.h
File metadata and controls
91 lines (73 loc) · 1.73 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
#pragma once
#include <iostream>
#include <event.h>
#include <ctime>
#include <thread>
using namespace std;
struct dataTest
{
event* field1;
int field2;
};
void empytCB(evutil_socket_t fd, short what, void *arg)
{
}
class Timer
{
private:
timeval tv_sec;
event_base *base;
public:
void SetTimer()
{
tv_sec = { 1, 0 };
base = event_base_new();
event *timeout = event_new(base, -1, EV_PERSIST | EV_TIMEOUT, empytCB, NULL);
event_add(timeout, &tv_sec);
event_base_dispatch(base);
cout << "dispatch" << endl;
}
public:
void addTimer(int seconds, int microseconds, event_callback_fn cb,dataTest* dt)
{
tv_sec = { seconds, microseconds };
event *timeout = event_new(base, -1, EV_PERSIST | EV_TIMEOUT, cb, dt);
dt->field1 = timeout;
event_add(timeout, &tv_sec);
}
void addOnceTimer(int seconds, int microseconds, event_callback_fn cb, dataTest* dt)
{
tv_sec = { seconds, microseconds };
event* timeout = event_new(base, -1, EV_TIMEOUT, cb, dt);
dt->field1 = timeout;
event_add(timeout, &tv_sec);
}
};
//传入数据类型
void cb(evutil_socket_t fd, short what, void *arg)
{
dataTest *dt = (dataTest*)arg;
dt->field2--;
cout << getSystemClock_microSeconds()<<"event ocurrence every 10ms" << " seconds. dataTest:" << dt->field2 << endl;
if (dt->field2 < 0)
{
event_del(dt->field1);
}
}
//////以下为测试////////
dataTest dt{ nullptr, 3 };
void threadWork(Timer* timer)
{
cout << "wait for 3 sencond" << endl;
std::this_thread::sleep_for(std::chrono::milliseconds(3000));
cout << getSystemClock_microSeconds() << "add timer:" << endl;
timer->addTimer(0, 1000*1000, cb, &dt);
dt.field2 = 10;
}
void TimerTest()
{
Timer timer;
thread *t1 = new thread(threadWork,&timer);
t1->detach();
timer.SetTimer();
}