您的位置:首页 > 其它

ev_periodic

2015-09-23 15:56 951 查看
#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函数库的支持

运行结果如下图:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  libev