Либев нестандартные события

Я пытаюсь использовать libev для программирования на основе событий. Но есть некоторые события, предоставляемые libev, как EV_READ, EV_WRITE, EV_TIMER ..

Итак, возможно ли провести собственное мероприятие самостоятельно.

Например, у меня есть непрерывный поток сообщений из сокета, и меня интересует только тип сообщения в этом потоке сообщений. Итак, это в основном как

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

Итак, я хочу зарегистрироваться для такого рода событий (только if состояние выполнено.). Это собственное событие, верно? Как мне указать это событие для libev.

Я имею в виду в LIVEV мы указываем, как это ..

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

Я не вижу каких-либо вещей, где мы можем проверить наши собственные события. Является ли это возможным ?

3

Решение

К сожалению, у вас не может быть пользовательского события, потому что libev не манипулирует вашими данными, просто проверяет, есть ли они, или если вы можете отправить их.

В общем, вам нужно:

  1. Создать наблюдателя с EV_READ
  2. Когда наблюдатель запустит вашу функцию, проверьте, есть ли сообщение, которое вы хотите:
    • если да, отправьте его в очередь сообщений
    • если нет, просто пропустите
  3. Бежать ev_loopв идеале с EV_ONESHOT и наблюдатель тайм-аута. Сразу после этого вызовите ваш обработчик сообщений, который проверит очередь сообщений и обработает все сообщения, которые находятся в очереди.
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]