我目前正在使用libevent編寫一個多線程應用程序。libevent中的用戶觸發事件
有些事件是由IO觸發的,但我需要通過使用event_active()由代碼本身在線程間觸發的一對事件。
我試圖寫一個簡單的程序,其中顯示出我的問題是:)
事件使用創建event_new(和FD設置爲-1。
當調用event_add()時,如果使用超時結構,事件稍後將由event_base_dispatch正確處理。
如果event_add(EV,NULL)被替代地使用,則返回0(明顯成功的),但event_base_dispatch()返回1(這意味着沒有事件沒有被正確註冊。)
此行爲可以被測試使用下面的代碼和交換的event_add線:
#include <event2/event.h>
#include <unistd.h>
void cb_func (evutil_socket_t fd, short flags, void * _param) {
puts("Callback function called!");
}
void run_base_with_ticks(struct event_base *base)
{
struct timeval one_sec;
one_sec.tv_sec = 1;
one_sec.tv_usec = 0;
struct event * ev1;
ev1 = event_new(base, -1, EV_PERSIST, cb_func, NULL);
//int result = event_add(ev1, NULL);
int result = event_add(ev1, &one_sec);
printf("event_add result: %d\n",result);
while (1) {
result = event_base_dispatch(base);
if (result == 1) {
printf("Failed: event considered as not pending dispite successful event_add\n");
sleep(1);
} else {
puts("Tick");
}
}
}
int main() {
struct event_base *base = event_base_new();
run_base_with_ticks(base);
return 0;
}
編譯:G ++ sample.cc -levent
的事情是,我不需要超時,並且不希望使用正年超時作爲解決方法。所以如果這不是使用用戶觸發事件的正確方法,我想知道它是如何完成的。
謝謝尼克的快速回復。 – Quentin
我對此有幾點意見: - 至於我目前的項目,我認爲我可以通過略微不同地使用事件循環來解決這個問題,並且使用超時實際(不必要地)在相當長的等待後觸發處理1秒是服務器世界的永恆)。 - 爲什麼不能在fd或超時之前使用純粹的用戶觸發事件? - 如果事件將被忽略,event_add不應該返回0以外的東西嗎? 我受到event_base_add_virtual技巧的誘惑,但我更喜歡我的代碼與更高版本兼容。 – Quentin
可以使用純粹的用戶觸發事件:你可以用event_new(base,-1/* no fd * /,0/* no events * /,callback,callback_data)製作它們。你用event_active()激活它們。但是,您不需要使用event_add():event_add()僅適用於基礎應爲其自身輪詢的事件。 – nickm