私は現在、libeventを使ってマルチスレッドアプリケーションを書いています。libeventのユーザトリガイベント
一部のイベントはIOによってトリガーされますが、event_active()を使用してコード間でスレッド間でトリガーされるイベントが2つ必要です。
イベントがevent_new(使用して作成される)、および-1にFDセット:
私は私の問題がどこにあるかを示す簡単なプログラムを書くことを試みました。
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
事があり、私はタイムアウトを必要としない、とn-年使用したくないしタイムアウトを回避策として使用します。だから、これがユーザーが誘発するイベントを使用する正しい方法でない場合は、どうやってそれが行われているか知りたいと思います。
あなたの素早い返信のためのニックありがとうございます。 – Quentin
私はこれに関するいくつかのコメントを持っています: - 私の現在のプロジェクトについては、私はイベントループを少し使い方を変えて、これを回避して、実際に(不必要に) 1秒はサーバ世界の永遠です)。 - fdまたはタイムアウトのイベントの上で、純粋なユーザートリガーイベントを使用できるようにするのはなぜですか? - イベントが無視される場合、event_addは0以外の何かを返しませんか? 私はevent_base_add_virtualトリックに誘惑されましたが、自分のコードがより新しいバージョンと互換性があります。 – Quentin
純粋なユーザートリガーイベントを使用することができます。event_new(base、-1/* no fd * /、0/*イベントなし*、コールバック、callback_data)でイベントを作成します。 event_active()でそれらをアクティブにします。ただし、event_add()はevent_add()ではありません。event_add()は、ベースがそれ自身のためにポーリングしなければならないイベントに対してのみです。 – nickm