工业软件架构 - 事件驱动 - 1
- 0.事件总线(EventBus)
- 1. 传感器模块(Sensor Module)
- 2. 硬件控制模块(Hardware Control Module)
- 3. 按键处理模块(Button Handler Module)
- 4. 界面管理模块(UI Module)
- 5. 参数管理模块(Parameter Manager Module)
- 6. 主程序集成与初始化
- 7. 总结
- 8.在设计监控和轮询机制时,选择使用定时器(QTimer)而不是线程池
- 1. Qt 事件驱动架构的优势
- 2. 实时性和响应性
- 3. 线程池的适用场景
- 4. 定时器 vs. 线程池的性能和复杂度对比
- 5. 实际应用中的折中
- 6. 具体应用场景分析
-
- 总结
0.事件总线(EventBus)
class EventBus : public QObject
{Q_OBJECTpublic:static EventBus* instance() {static EventBus bus;return &bus;}template<typename... Args>void publish(const QString &eventType, Args&&... args){emit eventOccurred(eventType, QVariant::fromValue(std::forward<Args>(args)...));}signals:void eventOccurred(const QString &eventType, const QVariant &data);private:EventBus() = default;~EventBus() = default;
};
1. 传感器模块(Sensor Module)
- 功能: 采集传感器数据,并通过事件总线向其他模块发布传感器数据更新事件。
- 实现: 使用一个管理类来管理所有传感器,并将采集的数据通过事件总线发布。
class SensorModule : public QObject
{Q_OBJECTpublic:SensorModule(QObject *parent = nullptr) : QObject(parent){startMonitoring();}signals:void sensorDataUpdated(int sensorId, double value);private slots:void startMonitoring() {QTimer *timer = new QTimer(this);connect(timer, &QTimer::timeout, this, &SensorModule::collectData);timer->start(100); }void collectData(){for (int sensorId = 0; sensorId < 100; ++sensorId) {double value = qrand() % 100 / 10.0; emit sensorDataUpdated(sensorId, value);EventBus::instance()->publish("SensorDataUpdated", sensorId, value);}}
};
2. 硬件控制模块(Hardware Control Module)
- 功能: 监控硬件状态,处理硬件控制命令,并与界面进行同步。
- 实现: 每个硬件设备由一个独立的类进行管理,通过事件总线接收控制命令。
class HardwareControlModule : public QObject{Q_OBJECTpublic:HardwareControlModule(QObject *parent = nullptr) : QObject(parent){connect(EventBus::instance(), &EventBus::eventOccurred, this, &HardwareControlModule::onEvent);