ev_timer

来源:互联网 发布:java怎么实现文件上传 编辑:程序博客网 时间:2024/05/03 17:59


#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");}


0 0