#include <stdio.h> #include <iostream> // libevent頭文件 #include <event.h> #include "tool.h" #include "header.h" static struct event tickEvt; static struct event_base *baseEvt; void PrintTime() { struct timeval timer; gettimeofday(&timer, NULL); volatile uint current_time = (uint)(timer.tv_sec); PRINT("current_time:%d", current_time); } // 定時事件回調函數 void onTime(int sock, short event, void *arg) { PrintTime(); struct timeval tv = {.tv_sec = 1, .tv_usec = 0 }; // 從新添加定時事件(定時事件觸發後默認自動刪除) event_add((struct event*)arg, &tv); } void startEvt() { // 初始化 event_init(); struct event evTime; // 設置定時事件 evtimer_set(&evTime, onTime, &evTime); struct timeval tv = {.tv_sec = 1, .tv_usec = 0 }; // 添加定時事件 event_add(&evTime, &tv); // 事件循環 event_dispatch(); } void StartEvent() { // 初始化 //event_init(); baseEvt = event_base_new(); // 設置定時事件 evtimer_set(&tickEvt, onTime, &tickEvt); struct timeval tv = {.tv_sec = 1, .tv_usec = 0 }; // 添加定時事件 //event_add(&tickEvt, &tv); event_base_set(baseEvt, &tickEvt); evtimer_add(&tickEvt, &tv); // 事件循環 //event_dispatch(); event_base_loop(baseEvt, 0); } int main(int argc, char* argv[]) { //startEvt(); StartEvent(); return 0; }
對libevent中Timer的分析:(http://www.monkey.org/~provos/libevent/doxygen-2.0.1/)
Timer:
libevent can also be used to create timers that invoke a callback after a certain amount of time has expired. The evtimer_set() function prepares an event struct to be used as a timer. To activate the timer, call evtimer_add(). Timers can be deactivated by calling evtimer_del().ios
大意思是:
libevent也能被用做一個「定時觸發器」,當指定的時間到期時,可以回調指定的特定函數(好比上面的代碼是回調event_handler,也就是說event_handler每一個1秒就再回調一次本身)。evtimer_set()函數初始化一個timer,激活timer調用evtimer_add()函數,刪除timer調用evtimer_del()函數。安全
1.evtimer_set()函數原型:
void evtimer_set(struct event ev, void(*)(evutil_socket_t, short, void *) cb, void *arg)
該函數修改結構體ev,將回調函數cb,回調函數的參數arg賦值該結構體ev中的成員。app
也許看到這裏你會有一個疑問:這是由於:
#define evtimer_set(ev, cb, arg) event_set(ev, -1, 0, cb, arg)socket
2.event_base_set函數原型:
int event_base_set(struct event_base *eb, struct event *ev)
Associate a different event base with an event.
將一個event關聯到一個不一樣的event base. 也就說咱們能夠將一個event關聯到不一樣的event base.函數
3.evtimer_add函數原型:
int evtimer_add(struct event *ev, const struct timeval *timeout)
Add an event to the set of monitored events. 將一個event加入到被監視的事件集合。
ev an event struct initialized via event_set()
timeout the maximum amount of time to wait for the event, or NULL to wait forever.oop
4.evtimer_del函數原型:
#define evtimer_del(ev) event_del(ev)
so:
int evtimer_del(struct event * ev)
Delete a timer event.
ev the event struct to be disabledflex
總結一下:
1. 首先調用event_base_new(或者event_init,推薦調用前者),對libevent進行惟一的一次初始化。
before using any of the functions in the library, you must call event_init() or event_base_new() to perform one-time initialization of the libevent library.ui
2. 而後調用evtimer_set初始化一個struct event結構體,也就是將利用evtimer_set的參數(即回調函數和回調函數的參數)填充struct event 結構體。
The evtimer_set() function prepares an event struct to be used as a timer。spa
再調用evtimer_add()將被evtimer_set初始化的struct event結構體加入到被監視的集合中.
To activate the timer, call evtimer_add().線程
刪除一個event調用evtimer_del()
Timers can be deactivated by calling evtimer_del().
3.最後調用event_base_loop()或者event_base_dispatch()或者event_dispatch(),推薦調用第一個,最後一個是非線程安全的版本。
從而開始處理事件集合,開始對event集合進行監視monitor.
Loop to process events. In order to process events, an application needs to call event_dispatch(). event_base_dispatch() is threadsafe event dispatching loop.
event_base_loop() is a more flexible version of event_base_dispatch().
注意帶有base字樣的函數是對全局的libevent進行操做的。