2015-03-19 42 views
0

我正面臨一個問題,可能會誤解這句話的真正含義「應用程序只需調用event_dispatch(),然後添加或刪除事件動態而不必更改事件循環。「或者我找不到如何做到這一點的正確文件。 嗯,問題是我認爲我應該可以在event_dispatch()運行後將事件添加到事件循環中,但我無法使其工作。下面是代碼:Libevent,無需更改事件循環即可動態添加或刪除事件

#include <event2/event.h> 
#include <event2/buffer.h> 
#include <event2/bufferevent.h> 

#include <stdio.h> 

static int n_calls = 0; 
static int n_calls2 = 0; 

void cb_func(evutil_socket_t fd, short what, void *arg) 
{ 
    struct event *me = arg; 

    printf("cb_func called %d times so far.\n", ++n_calls); 

    if (n_calls > 100) 
     event_del(me); 
} 

void cb_func2(evutil_socket_t fd, short what, void *arg) 
{ 
    struct event *me = arg; 

    printf("cb_func2 called %d times so far.\n", ++n_calls2); 

    if (n_calls2 > 100) 
     event_del(me); 
} 

int main(int argc, char const *argv[]) 
{ 
    struct event_base *base; 
    enum event_method_feature f; 

    base = event_base_new(); 
    if (!base) { 
     puts("Couldn't get an event_base!"); 
    } else { 
     printf("Using Libevent with backend method %s.", 
      event_base_get_method(base)); 
     f = event_base_get_features(base); 
     if ((f & EV_FEATURE_ET)) 
      printf(" Edge-triggered events are supported."); 
     if ((f & EV_FEATURE_O1)) 
      printf(" O(1) event notification is supported."); 
     if ((f & EV_FEATURE_FDS)) 
      printf(" All FD types are supported."); 
     puts(""); 
    } 

    struct timeval one_sec = { 1, 0 }; 
    struct timeval two_sec = { 2, 0 }; 
    struct event *ev; 
    /* We're going to set up a repeating timer to get called called 100 times. */ 
    ev = event_new(base, -1, EV_PERSIST, cb_func, NULL); 
    event_add(ev, &one_sec); 

    event_base_dispatch(base); 

    // This event (two_sec) is never fired if I add it after calling event_base_dispatch. 
    // If I add it before calling event_base_dispatch it works as the other event (one_sec) also does. 
    ev = event_new(base, -1, EV_PERSIST, cb_func2, NULL); 
    event_add(ev, &two_sec); 

    return 0; 
} 

回答

1

現在我明白了...我不知道爲什麼,但我在想,在事件循環開始在另一個線程或類似的東西運行。我現在看到,我試圖做的事情沒有意義。您可以在回調中添加事件,即循環運行時。當你啓動事件循環時,它永遠不會返回,所以之後的所有事情都不會被調用(除非你停止事件循環)