parametro - callback javascript
Libev, cómo pasar argumentos a callbacks relevantes (2)
El autor lo contestó él mismo, pero en un comentario. Dado que esto aparece como sin respuesta, estoy publicando su respuesta en la sección "respuesta" y cerrando el ciclo. No estoy seguro de si hay una mejor manera ... siéntase libre de arreglar esto.
El autor de la pregunta dice:
Lo siento, creo que tengo la respuesta ahora y me siento profundamente avergonzado por mi descuido de leer la documentación:
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);
Y luego usamos el my_io así:
static void my_cb (struct ev_loop *loop, ev_io *w_, int revents) { struct my_io *w = (struct my_io *)w_; //... }
Estoy atrapado en una situación de discusión pasando en Libev.
Por lo general, libev recibe paquetes en una función como * receive_callback * , eso está bien, pero en la práctica, necesitamos enviar un * write_callback * relativo para tratar con trabajos específicos de acuerdo con el paquete recibido. Por ejemplo:
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:
// .......
}
Mi pregunta es, si el write_callbackX
también tiene que leer el contenido específico en recv_buff, ¿cómo podemos pasar el argumento recv_buff al callbackX? ¿Debemos soportar la carga y la fealdad de las variables globales aquí?
Sí, se explica en el documento libev, y hay otra manera. Cada observador tiene un miembro de datos void * que puede leer o modificar, y libev lo ignorará por completo, por lo que puede pasar el argumento de esta manera:
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;
...
}
ver documento libev .