libevent:使计时器持久化
Posted
技术标签:
【中文标题】libevent:使计时器持久化【英文标题】:libevent: make timer persistent 【发布时间】: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”被打印一次然后程序退出......
我希望它无限期地输出“你好”。
如何做到这一点?提前非常感谢,
【问题讨论】:
【参考方案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中的更多示例
【讨论】:
以上是关于libevent:使计时器持久化的主要内容,如果未能解决你的问题,请参考以下文章