struct timer{
uv_timer_t uv_timer; //libuc timer handle
void(*on_timer)(void* udata);
void* udata;
int repeat_count; //-1是一直循环
};
alloc_timer函数是初始化一个timer信息,通过uv_timer_init函数把timer加入到libuv事件管理里面,on_uv_timer是整个timer的循环管理函数
struct timer* alloc_timer(void(*on_timer)(void* udata), void* udata, int repeat_count){
struct timer* t = (struct timer*)my_malloc(sizeof(struct timer));
memset(t, 0, sizeof(struct timer));
t->on_timer = on_timer;
t->udata = udata;
t->repeat_count = repeat_count;
uv_timer_init(uv_default_loop(), &t->uv_timer);
return t;
}
struct timer* schedule(void(*on_timer)(void* udata), void* udata, int after_msec, int repeat_count){
struct timer* t = alloc_timer(on_timer, udata, repeat_count);
//libuv启动一个timer
t->uv_timer.data = t;
uv_timer_start(&t->uv_timer, on_uv_timer, after_msec, after_msec);
//end
return t;
}
int uv_timer_start(uv_timer_t* handle, uv_timer_cb cb, uint64_t timeout, uint64_t repeat);
参数一:uv_timer_t的句柄
参数二:timer执行的回调函数
参数三:第一次多少秒后运行
参数四:后面多久重复一次
uv_timer_start(&timer_req, callback, 10000, 1000);
表示10秒后运行,之后每一秒运行一次
主要timer处理函数
static void on_uv_timer(uv_timer_t* handle){
struct timer* t = (struct timer*) handle->data;
if (t->repeat_count < 0){ //一直重复执行
t->on_timer(t->udata);
}
else{
t->repeat_count--;
t->on_timer(t->udata);
if (t->repeat_count == 0){ //表是timer需要停止了
uv_timer_stop(&t->uv_timer); //停止这个timer
free_timer(t); //释放内存
}
}
}
判断repeat_count小于0,则一直重复运行
否则timer->repeat_count--,然后执行timerz中的函数on_timer
判断如果repeat_count等于0,表示重复次数已经执行完成,uv_timer_stop停止timer
使用方法
static void on_logger_timer(void* udata){
log_debug("hello world");
}
//3秒后执行on_logger_timer函数,-1表示一直重复执行
schedule(on_logger_timer, NULL, 3000, -1);