#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】ev_periodic
猜你喜欢
转载自blog.csdn.net/u011362297/article/details/48681293
今日推荐
周排行