常见工具库定时器分析(1)

571 阅读1分钟

这是我参与8月更文挑战的第5天,活动详情查看:8月更文挑战

timer

定时器在各种场景都需要用到,主要用途是执行定时任务。 下面先看一下tbox的定时器。

tbox

使用场景:

  • 提供高精度定时器

tb_timer

tb_timer_ref_t      tb_timer(tb_noarg_t);
​

全局定时器

tb_timer_init

tb_timer_ref_t      tb_timer_init(tb_size_t grow, tb_bool_t ctime);
​

初始化定时器

tb_timer_exit

tb_void_t           tb_timer_exit(tb_timer_ref_t timer);
​

退出定时器

tb_timer_kill

tb_void_t           tb_timer_kill(tb_timer_ref_t timer);
​

杀死定时器

tb_timer_clear

tb_void_t           tb_timer_clear(tb_timer_ref_t timer);
​

清理定时器

tb_timer_delay

tb_size_t           tb_timer_delay(tb_timer_ref_t timer);
​

延长定时器

tb_timer_top

tb_hize_t           tb_timer_top(tb_timer_ref_t timer);
​

返回定时器何时执行

tb_timer_spak

tb_bool_t           tb_timer_spak(tb_timer_ref_t timer);
​

单线程外部循环的spak计时器

tb_timer_loop

tb_void_t           tb_timer_loop(tb_timer_ref_t timer);
​

外部线程的循环定时器

tb_timer_task_post

tb_void_t           tb_timer_task_post(tb_timer_ref_t timer, tb_size_t delay, tb_bool_t repeat, tb_timer_task_func_t func, tb_cpointer_t priv);
​

延迟后的后定时器任务,过期后将自动删除

tb_timer_task_post_at

tb_void_t           tb_timer_task_post_at(tb_timer_ref_t timer, tb_hize_t when, tb_size_t period, tb_bool_t repeat, tb_timer_task_func_t func, tb_cpointer_t priv);
​

按照绝对时间删除定时器任务,并在自动删除后,过期

tb_timer_task_post_after

tb_void_t           tb_timer_task_post_after(tb_timer_ref_t timer, tb_hize_t after, tb_size_t period, tb_bool_t repeat, tb_timer_task_func_t func, tb_cpointer_t priv);
​

按照相对时间删除定时器任务,并在自动删除后,过期

tb_timer_task_init

tb_timer_task_ref_t tb_timer_task_init(tb_timer_ref_t timer, tb_size_t delay, tb_bool_t repeat, tb_timer_task_func_t func, tb_cpointer_t priv);
​

初始化延迟定时器任务,需要手动删除它

tb_timer_task_init_at

tb_timer_task_ref_t tb_timer_task_init_at(tb_timer_ref_t timer, tb_hize_t when, tb_size_t period, tb_bool_t repeat, tb_timer_task_func_t func, tb_cpointer_t priv);
​

按照绝对时间初始化定时器任务,需要手动删除它

tb_timer_task_init_after

tb_timer_task_ref_t tb_timer_task_init_after(tb_timer_ref_t timer, tb_hize_t after, tb_size_t period, tb_bool_t repeat, tb_timer_task_func_t func, tb_cpointer_t priv);
​

按照相对时间初始化定时器任务,需要手动删除它

tb_timer_task_exit

tb_void_t           tb_timer_task_exit(tb_timer_ref_t timer, tb_timer_task_ref_t task);

退出定时器任务,如果尚未调用该任务,则不会调用该任务

tb_timer_task_kill

tb_void_t           tb_timer_task_kill(tb_timer_ref_t timer, tb_timer_task_ref_t task);
​

杀死定时器任务,如果尚未调用该任务,则不会调用该任务

你可以通过设置

全局的默认tb_timer()中投递的定时器任务,tbox会在后台创建一个单独的线程去维护它的所有任务。

如果觉得这个太占资源, 自己有特定线程在不断loop的话可以创建个独立的timer,挂接到自己的loop线程中,重用线程资源: