У меня есть проблема с ev_timer из libev, пожалуйста, посмотрите на код ниже:ev_timer обратного вызова вызывается раньше, чем это должно быть
static void timeout_cb(struct ev_loop *loop, ev_timer *timer, int revent) {
printf("got an timeout event, current time %s\n", get_current_time());
}
int main(int argc, char *argv[]) {
struct ev_loop *loop = ev_loop_new(0);
ev_timer_init(&timer, timeout_cb, 5.0, 0.0);
ev_timer_start(loop, &timer);
ev_run(loop, EVRUN_NOWAIT); // callback should not be called
ev_timer_stop(loop, &timer); // stop the timer
sleep(5); // sleep 5 seconds, 5 is also the timer's timeout value
// restart timer
ev_timer_init(&timer, timeout_cb, 5.0, 0.0);
ev_timer_start(loop, &timer);
printf("timer start at: %s\n", get_current_time());
printf("timer remaining: %f\n", ev_timer_remaining(loop, &timer));
ev_run(loop, EVRUN_NOWAIT);
return 0;
}
Выход есть:
timer start at: 14:53:49:137
timer remaining: 5.0000
got an timeout event, current time 14:53:49:137
Это странно, потому что после перезапуска таймера таймер запускается немедленно, но он должен быть на 5 секунд позже. Я нашел причину сна (5). Я меняю его на спящий режим (4), тогда обратный вызов таймера не будет вызываться. Я запутался в функциях таймера лейбэва. Не понял ли я таймер? И как разрешить обратный вызов таймера после истечения тайм-аута после перезапуска таймера?
Вы должны добавить больше контекста к своему ответу относительно того, почему это устранило проблему. – Joe