【libev】ev_timer


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


猜你喜欢

转载自blog.csdn.net/u011362297/article/details/48518339