【libev】ev_periodic


#include <ev.h>
#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
#include <math.h> // for fmod

#define TIMEOUT 4.
struct ev_loop *loop = NULL;
ev_periodic periodic_watcher;

static void periodic_cb(struct ev_loop *loop, ev_periodic *w, int revents)
{
        printf("periodic_cb() call\n");
}

static ev_tstamp scheduler_cb(ev_periodic *w, ev_tstamp now)
{
        double mod = fmod(now, TIMEOUT);
        printf("scheduler_cb() call, now = %lf, mod = %lf\n", now, mod);
        return now + (TIMEOUT - mod);
}

void *ev_periodic_create(void *p)
{
        loop = ev_loop_new(EVFLAG_AUTO);

        // 下面三种初始化方法都可以,实现的效果是一样的。
        //ev_periodic_init(&periodic_watcher, periodic_cb, 0., TIMEOUT, 0); // periodic_cb每隔TIMEOUT秒被调用一次
        ev_periodic_init(&periodic_watcher, periodic_cb, 0., 0., scheduler_cb); // periodic_cb每隔TIMEOUT秒被调用一次
        //ev_periodic_init(&periodic_watcher, periodic_cb, fmod(ev_now(loop), TIMEOUT), TIMEOUT, 0); // periodic_cb每隔TIMEOUT秒被调>用一次

         // me:对于上面第二种初始化方法,执行下面这个方法后会主动去调用一次scheduler_cb函数(但此时并不触发periodic_cb函数),以后就是每隔TIMEOUT秒后才调用scheduler_cb,并且触发periodic_cb。
        ev_periodic_start(loop, &periodic_watcher);
        printf("ev_periodic_create() call, after start!\n");
        ev_run(loop, 0);
}

int main()
{
        pthread_t tid;
        pthread_create(&tid, NULL, ev_periodic_create, NULL);
        while(1)
        {
                static int count = 0;
                printf("count = %d\n", count++);
                sleep(1);
        }
        return 0;
}
编译命令:gcc periodic2.c -lev -lpthread -lm
-lm表示需要math函数库的支持

运行结果如下图:


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值