Task
提供Task Scheduler挂载用户创建定时的任务,不依赖系统的定时器来在用户代码逻辑中保证到时后执行任务的处理函数。
主要的功能:
- 创建和销毁Task Scheduler
- 创建和销毁一个任务(Task)
- 在Task Scheduler中插入和卸载任务
- Task Scheduler检查到期任务并执行
- 获取Task Scheduler的最近到期任务的时间
源文件
库文件:
应用示例:
创建Task Scheduler与Tasks
// 创建Task Scheduler
wa_task_scheduler_t bh_init_task_scheduler();
// 创建Task Scheduler并在一个独立的线程中运行
wa_task_scheduler_t bh_task_run_new_scheduler();
// 创建Task Scheduler
wa_task_t bh_new_task(char* task_name, void * data,
bool auto_free_data, // 任务销毁时是否自动调用free是否传入的data参数所指数据
int repeat_duration_ms, // 重复执行的毫秒数
bh_task_handler task_handler); // 任务的执行函数
void bh_delete_task(wa_task_t task);
wa_task_t
数据结构定义:
typedef struct _bh_task * wa_task_t;
typedef int (*bh_task_handler) (wa_task_t task);
typedef int (*bh_task_close_handler) (wa_task_t task);
struct _bh_task
{
struct _bh_task * next;
char* task_type;
char * task_data;
bh_task_handler handler;
bh_task_close_handler close_handler;
int repeat_interval_msecs; // 0 - no repeat, delete it after execution
tick_time_t next_execution;
unsigned int exec_count;
bool task_data_is_allocated;
};
在Task Scheduler中插入和卸载任务
// 在scheduler中插入新的Task
wa_task_t bh_schedule_task(wa_task_scheduler_t task_ctx,wa_task_t task, int msecs_from_now);
// 在scheduler中的Task重新设置任务时间
bool bh_reschedule_task(wa_task_scheduler_t task_ctx, char * task_name, int ms);
// 在scheduler中使用数据地址移除Task,并返回Task
wa_task_t bh_remove_task_by_data(wa_task_scheduler_t task_ctx,void * data_ptr);
// 在scheduler中使用名称移除Task,并返回Task
wa_task_t bh_remove_task_by_name(wa_task_scheduler_t task_ctx, char * name);
// 在scheduler中使用名称移除Task并且自动销毁
int bh_remove_all_tasks_by_name(wa_task_scheduler_t task_ctx, char * name);
Task Scheduler检查到期任务并执行
// 获取下一个到期的任务时间
wa_task_t bh_check_task(wa_task_scheduler_t task_ctx, int * msecs_to_first_task);
// 检查任务到期并自动执行到期任务
int task_check_expiry_ms(wa_task_scheduler_t task_ctx );
提示
如果已经执行bh_task_run_new_scheduler()
,则用户无需调用任务超时检查,在其所创建的线程中会自动完成所有任务超期检查。
示例代码
int task_read_sensor(wa_task_t task)
{
...
// the task can change the repeating frequence
task->repeat_interval_msecs = g_frequency*1000;
}
void init_task_thread()
{
g_task_ctx = bh_task_run_new_scheduler();
wa_task_t task1 = bh_new_task((char*)ZS_SENSOR_READ_TASK,
NULL,
true,
10*1000, // repeat task every 10 seconds
task_read_sensor);
bh_schedule_task(g_task_ctx, task1, 1);
wa_task_t task2 = bh_new_task((char*)ZS_REG_RD_TASK,
NULL,
true,
60*1000, // repeat task every 60 seconds
task_register_RD);
bh_schedule_task(g_task_ctx, task2, 0);
}