【问题标题】:libevent: make timer persistentlibevent:使计时器持久化
【发布时间】:2012-11-27 13:27:35
【问题描述】:

我有以下代码:

#include <stdio.h>
#include <sys/time.h>
#include <event.h>

void say_hello(int fd, short event, void *arg){
        printf("Hello\n");
}

int main(int argc, const char* argv[])
{
  struct event ev;
  struct timeval tv;

  tv.tv_sec = 3;
  tv.tv_usec = 0;

  event_init();
  evtimer_set(&ev,say_hello,NULL);
  evtimer_add(&ev, &tv);
  event_dispatch();

  return 0;
}

问题是“hello”被打印一次然后程序退出......

我希望它无限期地输出“你好”。

如何做到这一点?提前非常感谢,

【问题讨论】:

    标签: c timer libevent


    【解决方案1】:

    只是为了澄清 Basile 的解决方案:

    我也很困惑,直到我意识到“计时器”在这种情况下指的是单发计时器。我们需要的是一个间隔定时器;这需要 libevent 中的 EV_PERSIST 标志。

    struct timeval time;
    time.tv_sec = 1;
    time.tv_usec = 0;
    
    event_set(&my_event, 0, EV_PERSIST, my_function, NULL);
    evtimer_add(&my_event, &time);
    

    【讨论】:

      【解决方案2】:

      将main中的代码改为阅读

      evtimer_set(&ev,say_hello,&ev);
      

      并让你的 say_hello 函数

      void say_hello(int fd, short event, void *arg){
          struct event *ev = arg;
          struct timeval tv;
      
      
          printf("Hello\n");
          tv.tv_sec = 3;
          tv.tv_usec = 0;
      
          evtimer_add(ev, &tv);
      }
      

      【讨论】:

      • 这是此页面上适用于 OP 询问的 libevent 库版本 (1.4.x) 的唯一正确答案。
      【解决方案3】:

      这是 libevent2 的示例:

      #include <event2/event.h>
      
      static int n_calls = 0;
      
      void cb_func(evutil_socket_t fd, short what, void *arg)
      {
          struct event *me = arg;
      
          printf("cb_func called %d times so far.\n", ++n_calls);
      
          if (n_calls > 100)
             event_del(me);
      }
      
      void run(struct event_base *base)
      {
          struct timeval one_sec = { 1, 0 };
          struct event *ev;
          /* We're going to set up a repeating timer to get called called 100
             times. */
          ev = event_new(base, -1, EV_PERSIST, cb_func, event_self_cbarg());
          event_add(ev, &one_sec);
          event_base_dispatch(base);
      }
      

      【讨论】:

        【解决方案4】:

        您是否阅读了evtimer_set(3) 手册页?请再读一遍。

        您可能想要使用标志 EV_PERSIST 或从您的 say_hello 回调中调用 evtimer_add

        【讨论】:

        • 我没有使用 libevent2,而是 Ubuntu 12.04.1 中的 libevent1.4
        • 如何在回调函数中重新启动定时器?谢谢,
        【解决方案5】:
        #include <stdio.h>
        #include "ev.h"
        
        static void timer_cback_caller(EV_P_ ev_timer* w, int revents)
        {
            const int new_timeout_in_ms = 1200; // new delay between timer ticks
        
            printf("timer tick\n");
        
            w->repeat = new_timeout_in_ms / 1000.;
            ev_timer_again(EV_A_ w);
        }
        
        
        int main()
        {
            struct ev_loop *loop = ev_default_loop(0);
            ev_timer timer;
        
            const int start_delay_in_ms = 1000; // delay before first timer tick
            const int timeout_in_ms = 1500; // delay between every timer tick
        
            ev_timer_init(&timer, timer_cback_caller, start_delay_in_ms/1000., timeout_in_ms/1000.);
            ev_timer_start(loop, &timer);
            ev_run(loop, 0); // will never return
        
            return 0;
        }
        

        libev documentation中的更多示例

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-06-11
          • 2010-12-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-02-16
          • 2018-10-12
          相关资源
          最近更新 更多