3

イベントベースのプログラミングに libev を使用しようとしています。しかし、次のようなlibevによって提供されるいくつかのイベントがありますEV_READ, EV_WRITE, EV_TIMER ..

それで、私自身のカスタムイベントを持つことは可能ですか?

たとえば、ソケットからのメッセージの連続フローがあり、そのメッセージ ストリーム内のメッセージのタイプのみに関心があります。だから、基本的には

while(true)
{
     Msg msg = getMessage();
     if(msg != null && msg.id == ourId)
         return msg;
}

ということで、こういうイベントに登録したい(そのif条件だけは満たしている)。カスタムイベントですよね?このイベントを libev に指定するにはどうすればよいですか。

つまり、libev では次のように指定します。

ev_io_init (&stdin_watcher, stdin_cb, /*STDIN_FILENO*/ 0, EV_READ);
ev_io_start (loop, &stdin_watcher);

自分のイベントを確認できるものは見当たりません。出来ますか ?

4

1 に答える 1

1

libev はデータを操作せず、カスタム イベントがあるかどうか、または送信できるかどうかをチェックするだけなので、残念ながらカスタム イベントを作成することはできません。

したがって、基本的には、次のことを行う必要があります。

  1. でウォッチャーを作成するEV_READ
  2. ウォッチャーが関数を起動したら、必要なメッセージがあるかどうかを確認します。
    • はいの場合は、メッセージ キューにプッシュします
    • そうでない場合は、スキップしてください
  3. ev_loop、理想的にEV_ONESHOTはタイムアウトウォッチャーを使用して実行します。その直後に、メッセージ ハンドラを呼び出します。これにより、メッセージ キューがチェックされ、キューにあるすべてのメッセージが処理されます。
于 2013-09-29T12:23:23.417 に答える