1. 需求分析和软件设计
嵌入式设备针对自身硬件有定时监测的需求,根据硬件的不同,监测周期和项目有所区别,但是监测的触发机制和流程是类似的。
通过分析,可以利用C++模板和多态的特性,设计一个监测任务基类MonitorTask,针对单个硬件的检测任务Task1~N,继承和实现MonitorTaskA。再通过一个Controller类,来管理Task任务的执行。类图如下:
如此设计的好处:
1. 在不改变现有监测的基础上,可以灵活添加和删除新的硬件监测任务,而不影响现有的软件框架。
2. MonitorController可以统一管理全部的监测任务,也可以单独屏蔽或者执行某个task,同时不用针对每个Task编写触发逻辑,当然这也是建立在所有的任务的触发机制是相同的基础上。
2. 代码实现
基类MonitorTask以及两个子类TemperatureMonitorTask和HumidityMonitorTask。
class MonitorTask
{
public:
virtual bool run() = 0;
virtual void stop() = 0;
};
class TemperatureMonitorTask : public MonitorTask
{
public:
bool run() override
{
cout << "run temperature monitor" << endl;
return false;
}
void stop() override
{
cout << "stop temperature monitor" << endl;
}
};
class HumidityMonitorTask : public MonitorTask
{
public:
bool run() override
{
cout << "run humidity monitor" << endl;
return true;
}
void stop() override
{
cout << "stop humidity monitor" << endl;
}
};
MonitorController 可以定义为模板类,参数为任务数量number_of_tasks。
template<size_t number_of_tasks>
class MonitorController{
public:
MonitorController(){}
void start_monitor(){
current_task = 0;
}
bool is_done(){
return current_task == end_of_task;
}
void run_task(){
if(current_task != end_of_task){
const bool task_done = monitor_tasks[current_task]->run();
if(task_done){
++current_task;
}
}
}
void stop_monitor(){
for(size_t i=0; i<end_of_task; ++i){
monitor_tasks[i]->stop();
}
}
void add_new_monitor_task(MonitorTask* monitor_task_cur){
if((monitor_task_cur!=NULL) and (end_of_task < monitor_tasks.size())){
monitor_tasks[end_of_task] = monitor_task_cur;
end_of_task++;
}
}
private:
std::array<MonitorTask*, number_of_tasks> monitor_tasks{};
size_t current_task{};
size_t end_of_task{};
};
main函数,测试代码。
int main()
{
/* 创建 controller 和 monitor task 实例 */
MonitorController<2> monitor_controller;
TemperatureMonitorTask temperature_monitor_task;
HumidityMonitorTask humidity_monitor_task;
/* add monitor task to controller */
monitor_controller.add_new_monitor_task(&temperature_monitor_task);
monitor_controller.add_new_monitor_task(&humidity_monitor_task);
monitor_controller.start_monitor();
while (not monitor_controller.is_done())
{
monitor_controller.run_task();
}
monitor_controller.stop_monitor();
return 0;
}
程序运行结果:
3. 代码持续优化
在某些复杂的应用场景下,可以结合工厂模式来优化监测任务的创建过程。同时,使用std::map来管理监测任务,能够实现更加灵活的任务管理。