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函数库的支持 运行结果如下图:
相关文章推荐
- Mac OS X 10.9 安装gevent
- libev学习笔记(二)——ev_io
- libev socket 的一个服务器
- ev_io
- ev_timer
- libev事件库
- VisuaGDB 编译、调试libev
- 基于 libev 的 Qt 事件调度器:qt_eventdispatcher_libev
- libev事件驱动网络库从安装到使用
- 使用libev写服务器
- ev_async
- 最好用的嵌入式网络C库/Lua库
- accept()ing when you can’t问题分析
- 使用 libevent 和 libev 提高网络应用性能——I/O模型演进变化史
- Libev源码分析08:Libev中的信号监视器
- libev 学习笔记
- libev 学习笔记之源码树
- libev 学习笔记之主体事件循环
- libev 学习笔记之timer实现原理