libevent中的Timer使用

#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進行操做的。

相關文章
相關標籤/搜索