定时器

优质
小牛编辑
129浏览
2023-12-01

定时器用于将一些操作推迟到指定时间之后执行。LCUI 的定时器都是在主线程中处理的,这意味着定时器的时间粒度受到帧率的限制,不能小于每帧的停留时间。举个例子:当前帧率为 120 帧每秒,那么时间粒度就是 8.33 毫秒,如果你设置定时器的等待时间是 20 毫秒,那么实际的等待时间会大于等于 25 毫秒,也就在设置定时器后的第三帧时处理这个定时器。这种精确度的定时器能够应付大多数场景,如果你需要更加精确的定时器,我们建议你选择其它定时器库,或自行编码实现。

简单的例子

这个例子展示了如何设置和释放定时器:

#include <stdio.h>
#include <LCUI.h>
​
void OnTimeout(void *arg)
{
    int *timer_id = arg;
​
    LCUITimer_Free(*timer_id);
    LCUI_Quit();
    printf("timeout\n");
}
​
void OnInterval(void *arg)
{
    printf("interval\n");
}
​
int main(void)
{
    int timer_id;
​
    LCUI_Init();
    timer_id = LCUI_SetInterval(1000, OnInterval, 0);
    LCUI_SetTimeout(5000, OnTimeout, &timer_id);
    return LCUI_Main();
}

首先调用 LCUI_SetInterval() 设置定时器每隔 1 秒调用一次 OnInterval() 函数,并将它返回的定时器标识号赋值给 timer_id ,然后调用LCUI_SetTimeout() 设置一个定时器在 5 秒后调用 OnTimeout() 函数,并将 timer_id 的引用作为参数传给 OnTimeout() 函数。

待办事项

重新设计定时器的接口

改用面向对象模式代替单例模式,示例:

// 当前的接口设计
LCUI_InitTimer();
LCUI_FreeTimer();
LCUITimer_Set();
LCUITimer_Free();
LCUI_ProcessTimers();
​
// 新的接口设计
TimerList_New();
TimerList_Free();
TimerList_Add();
TimerList_Remove();
TimerList_Process();

在新的设计中,不再是全局共用同一个定时器列表,允许开发者基于定时器接口实现一个定时器线程,以此摆脱 LCUI 主循环对定时器精度的影响。