#include <ev.h> #include <stdio.h> #include <pthread.h> #define TIMEOUT 1. struct ev_loop *loop = NULL; ev_timer timer_watcher; static void timer_cb (EV_P_ ev_timer *w, int revents) { static int cb_count = 0; printf("timer_cb() call, cb_count = %d\n", cb_count++); //ev_break (EV_A_ EVBREAK_ONE); //若只调用ev_timer_stop方法,则就是一次性定时器。 ev_timer_stop(loop, &timer_watcher); ev_timer_set(&timer_watcher, TIMEOUT, 0.); ev_timer_start(loop, &timer_watcher); } void *ev_timer_create(void *p) { printf("ev_timer_create() start !\n"); loop = EV_DEFAULT; ev_timer_init (&timer_watcher, timer_cb, TIMEOUT, 0); ev_timer_start (loop, &timer_watcher); // after this invoke, ev_is_active() will no longer return 0 ev_run(loop, 0); printf("ev_timer_create() end !\n"); } int main (void) { pthread_t tid; pthread_create(&tid, NULL, ev_timer_create, NULL); while(1){} return 0; }
问题:ev_timer_init() 的第4个参数作何用处? 我们先来看看 ev_timer_init() 的函数定义: ev_timer_init (ev_timer *, callback, ev_tstamp after, ev_tstamp repeat); 在ev.h中对 ev_tstamp 作了如下定义: typedef double ev_tstamp; 原以为第4个参数repeat表示这个定时器重复执行的次数,待执行完便退出的。 而实际上这个参数的意义并非如此。对上面的例程中的timer_cb 和 ev_timer_create 方法作如下改动(红色字体部分),即: 将timer_cb 的 ev_timer_stop、ev_timer_set、ev_timer_start 注释掉;将ev_timer_create 的第4个参数改为 0.1 。 其运行结果是:回调timer_cb 在TIMEOUT 秒后被调用,此后每隔 0.1 秒调用一次 timer_cb 。 static void timer_cb (EV_P_ ev_timer *w, int revents) { static int cb_count = 0; printf("timer_cb() call, cb_count = %d\n", cb_count++); //ev_break (EV_A_ EVBREAK_ONE); //若只调用ev_timer_stop方法,则就是一次性定时器。 //ev_timer_stop(loop, &timer_watcher); //ev_timer_set(&timer_watcher, TIMEOUT, 0.); //ev_timer_start(loop, &timer_watcher); } void *ev_timer_create(void *p) { printf("ev_timer_create() start !\n"); loop = EV_DEFAULT; ev_timer_init (&timer_watcher, timer_cb, TIMEOUT, 0.1); ev_timer_start (loop, &timer_watcher); // after this invoke, ev_is_active() will no longer return 0 ev_run(loop, 0); printf("ev_timer_create() end !\n"); }