一、存储4任务队列用std::map<taplt_task_key, taplt_task>
kilnk有四种触发方式,对应着四种任务队列,分别是iot_tasks_、speech_tasks_、var_tasks_和timed_tasks_。队列中单元都是taplt_task,那用什么std容器表示这个队列?——一个原则:以下操作既不能改变taplt_task对象指针,也不能影响xxx_tasks_排序
- 修改队列中taplt_task某个成员变量,像tbg_task::modify_task。
- 向队列添加一个taplt_task,不论在哪个位置。
- 从队列删除一个taplt_task,不论在哪个位置。
数据结构std::map,具体类型是std::map<taplt_task_key, taplt_task>。
- 用std::map<std::taplt_task_key, taplt_task>作为xxx_tasks_变量类型,而不是std::list<taplt_task>,是方便iot_tasks_、speech_tasks_,它们关键字是在创建后,就不会变了,用std::map可以快速找到某个taplt_task。
- 在taplt_task_key中引入成员“int aux_key_id”。对var_tasks_和timed_tasks_,用于klink排序的成员分别是var_at_、zerotz_t。过程中,这两成员会被修改,因而不能放进taplt_task_key,而是改放进aux_key_id。队列中,aux_key_id会确保唯一。至于klink排序,tklink会用个叫ttask_key的类型,当中排序用到var_at_、zerotz_t,不会用到aux_key_id。一句话,aux_key_id作用就是确保唯一。
taplt_task为什么要分开var_at、timed_at。——它们在表示意义上的确一样,是数组索引。但在一些地方,像取值范围,它们可能是不一样的。
二、klink导出配置
在klink导出配置时,如果存在待添加定时任务(add_timed_tasks),部分定时任务(timed_tasks_)可能是属于待添加定时任务,在导出时,得去掉这部分定时任务。“timed_ats”存着这部分定时任务。
为什么要在导出时就去掉,而不是等到导入时?——导出时是今天,导入时可能在10天后。等10天后,已不可能根据待添加定时任务删除定时任务,因为待添加任务存储的是UTC时间。