使用 event_base_loop 添加计时器事件

Posted

技术标签:

【中文标题】使用 event_base_loop 添加计时器事件【英文标题】:adding timer events with event_base_loop 【发布时间】:2015-10-22 16:20:08 【问题描述】:

我的 ebase 线程执行以下循环 constexpr int kFlag = EVLOOP_ONCE; 而 ((res = event_base_loop(ebase_, kFlag)) == 1) 屈服();

和另一个(主)线程添加周期性定时器事件。它在ebase 线程调用event_base_loop 之后添加事件

event* ev = event_new(base(), -1, EV_PERSIST | EV_TIMEOUT, &PeriodicCb, data);
CHECK(0 == event_add(ev, &tv));

但是,我看到这个计时器事件没有运行。如果我将 kFlagEVLOOP_ONCE 更改为 0,它运行良好。我错过了什么?

【问题讨论】:

【参考方案1】:

罪魁祸首在于事件基础循环。正确的代码是这样的:

while ((res = event_base_loop(ebase, EVLOOP_ONCE)) >= 0) 
  if (start_cancel)
    break;

即它应该继续滚动,返回值不小于 0 而不仅仅是 1。

【讨论】:

以上是关于使用 event_base_loop 添加计时器事件的主要内容,如果未能解决你的问题,请参考以下文章

libevent定时器是怎么实现的

libevent - event_base_loop() 是不是应该重复获取事件?

关于定时器的那些事!

获取手机验证码倒计时那些事

Golang 完成一个 Crontab定时器

关于移动端浏览器转入后台后倒计时停止运行的问题