2014-02-25 40 views
0

我正在測試libevent的定時器功能。從計時器檢索基地?

我設定以下的計時器,它觸發計時器每3秒:

shared_ptr<event_base> base(event_base_new(), std::ptr_fun(event_base_free)); 
vector<shared_ptr<event> > std_events; 
... 

static const timeval three_sec = { 3, 0 }; 
event* tev = NULL; 

tev = evtimer_new(base.get(), NULL, NULL); 
rc = event_assign(tev, base.get(), -1, EV_PERSIST, timeout_cb, tev); 

rc = event_add(tev, &three_sec); 
shared_ptr<event> ptr(tev, std::ptr_fun(event_free)); 
std_events.push_back(ptr); 

rc = event_base_dispatch(base.get()); 

timeout_cb,我希望它跑了幾次,然後退出派遣循環:

void 
timeout_cb(evutil_socket_t fd, short events, void *arg) 
{ 
    static int count = 0; 
    int rc = 0; 

    event* timer = (event *)arg; 
    event_base* base = NULL;  

    if(count++ == 5) { 
     struct timeval delay = { 1, 0 }; 
     rc = event_base_loopexit(base, &delay); 
    } 
} 

我試圖避免在回調中arg的自定義結構。

event_base_loopexit需要base_event。是否有可能從evutil_socket_tevent*timer獲得base_event

回答

0

有兩種方法可以獲取base

event_get_base將檢索基地:

event_base* base = event_get_base(timer); 

event_get_assignment還將檢索base

event_base* base = NULL; 
event_get_assignment(timer, &base, NULL, NULL, NULL, NULL);