Libuv Timers定时器
在定时器启动后一段特定的时间后,定时器会调用回调函数。Libuv的定时器还可以设定为按照时间间隔定时启动,而不仅仅是启动一次。
简单地使用一个定时器,超过时间timeout
作为参数初始化定时器(意味第一次启动之后多久响应回调事件),还有一个可选参数repeat
。定时器可以在任意时刻被终止。
uv_timer_t timer_req;
uv_timer_init(loop,&timer_req);
uv_timer_start(&timer_req,callback,5000,2000);
上述操作会启动一个循环定时器(repeating timer),它会调用uv_timer_start后,5秒(timeout)启动回调函数,然后每2秒(repeat)循环启动回调函数。可以使用:
uv_timer_stop(&timer_req);
来终止一个定时器。这个函数也可以在回调函数中被安全地使用。
循环的间隔也可以被随时定义,使用:
uv_timer_set_repeat(uv_timer_t* timer,int64_t repeat);
它会在可能的情况下发挥作用。如果上述函数是在定时器回调函数中被调用,这意味着:
- 如果定时器未设置循环,此时定时器已经停止。需要先用
uv_timer_start
重新启动。- 如果定时器被设置为循环,那么下一次超时的时间已经被规划好,所以在切换新的循环间隔之前,旧的循环间隔仍然还会发挥一次作用。
工具函数:
int uv_timer_again(uv_timer_t *)
只适用于循环定时器,相当于停止定时器,然后把原先的timeout
和repeat
值都设置为之前的repeat
值,并启动定时器。如果调用该函数的时候,定时器尚未启动,那么则调用失败(错误码UV_EINVAL
)并返回-1。
简单示例
static uv_timer_t testTimer;
void Test(uv_timer_t* handle)
{
fprintf(stdout, "load Test1 %llu\n", uv_now(g_loop));
static int count = 0;
count++;
fprintf(stdout, "update shopActive %d\n", count);
if (count == 5)
{
fprintf(stdout, "save shopData %d\n", count);
count = 0;
}
}
int main(int argc, char* argv[])
{
g_loop = uv_default_loop();
uv_timer_init(g_loop, &testTimer);
uv_timer_start(&testTimer, Test, 0, 5000);
uv_run(g_loop, UV_RUN_DEFAULT);
printf("main loop stop\n");
return 0;
}