2015-03-19 8 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

Я вижу это сейчас ... Я не знаю, почему, но я думал, что событие-цикл начал работать в другом потоке или что-то в этом роде. Теперь я вижу, что то, что я пытаюсь сделать, не имеет смысла. Вы можете добавлять события внутри обратных вызовов, то есть когда цикл работает. Когда вы запускаете цикл событий, он никогда не возвращается, так что после этого никогда не будет вызываться (если вы не остановите цикл события)