#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