gpt4 book ai didi

c - ev_timer 回调被调用早于它应该被调用的时间

转载 作者:太空宇宙 更新时间:2023-11-04 02:09:17 24 4
gpt4 key购买 nike

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 秒后触发。我发现原因是 sleep (5)。我将其更改为 sleep(4) 然后将不会调用计时器回调。我对 liebev 的计时器功能感到困惑。我对计时器有误解吗?以及如何在定时器重启后让定时器回调在超时后调用?

最佳答案

你应该修改代码

ev_timer_init(&timer, timeout_cb, 5.0, 0.0);

ev_timer_init(&timer, timeout_cb, ev_time() - ev_now() + 5.0, 0.0);

因为 libev 出于性能原因会缓存时间戳,并且只会在每个事件循环之前或之后更新时间戳。 sleep 5秒后,当前实时时间为T + 5,即ev_time,但libev当前时间戳仍为T ,即 ev_now。然后你像这样初始化一个计时器

ev_timer_init(&timer, timeout_cb, 5.0, 0.0);

libev会将定时器的触发时间设置为当前时间戳加5,即T + 5,也是当前实时时间,所以会立即触发。但是当你像这样初始化定时器时

ev_timer_init(&timer, timeout_cb, ev_time() - ev_now() + 5.0, 0.0);

libev 会在当前时间戳 puls ev_time() - ev_now() + 5.0 设置定时器的触发时间,即 T + T + 5 - T + 5 = T + 5 + 5 = 实时 + 5。所以它会在五秒后触发。

关于c - ev_timer 回调被调用早于它应该被调用的时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16560745/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com