Либев, Как передать аргументы в соответствующие обратные вызовы - PullRequest
23 голосов
/ 30 марта 2012

Я попал в ситуацию, когда аргумент передается в libev.

Обычно, libev получает пакеты в такой функции, как * receive_callback *, это нормально, но на практике нам нужно отправить относительный * write_callback * для работы с конкретными заданиями в соответствии с к полученной посылке. Например:

S_RECV_MSG* pstRecvMsg = (S_RECV_MSG*) recv_buff;
switch(pstRecvMsg->wMsgType) {
    case 1: 
        ev_io_init(w, write_callback1, w->fd, EV_WRITE);
        break;
    case 2:
        ev_io_init(w, write_callback2, w->fd, EV_WRITE);
        break;
    case 3:
        // .......
}

Мой вопрос таков: если write_callbackX также должен прочитать конкретное содержимое в recv_buff, как мы можем передать аргумент recv_buff в callbackX? Должны ли мы нести бремя и уродство глобальных переменных здесь?

Ответы [ 2 ]

5 голосов
/ 11 июля 2013

Автор ответил сам, но в комментарии.Поскольку это отображается как неотвеченный, я публикую его ответ в разделе «ответ» и закрываю цикл.Не уверен, что есть лучший способ ... не стесняйтесь это исправить.

Автор вопроса говорит:

Извините, я думаю, что получил ответ сейчас, и мне очень стыднопри моей неосторожности чтения документации:

struct my_io{
   ev_io io;
   int otherfd;
   void *somedata;
   struct whatever *mostinteresting;
};
// ...
struct my_io w;
ev_io_init (&w.io, my_cb, fd, EV_READ);

А потом мы используем my_io вот так:

static void my_cb (struct ev_loop *loop, ev_io *w_, int revents)
{
   struct my_io *w = (struct my_io *)w_;
   //...
}
2 голосов
/ 17 января 2015

Да, это объясняется в документе libev, и есть другой способ. У каждого наблюдателя есть элемент данных void *, который вы можете прочитать или изменить, и libev полностью его проигнорирует, поэтому вы можете передать аргумент так:

w->data = (void *)recv_buff;
...
static void my_cb (struct ev_loop *loop, ev_io *w_, int revents)
{
    S_RECV_MSG *recv_buff = (S_RECV_MSG*)w_->data;
    ...
}

см. libev документ .

...