#pragma once #include #include #include #include #include "../TopicMonitorFactory/TopicMonitor.h" #include "../TopicManager/TopicManager.h" #include "../TypeDefine.h" class DataMonitorThread : public QThread { Q_OBJECT public: explicit DataMonitorThread(QObject *parent = nullptr); ~DataMonitorThread(); signals: void updateMonitoringData(const QString &varName, const QString &value); void sendDebugMessage(int type, const QString &message); // 发送调试信息的信号声明 public slots: /** * @brief 设置线程休眠时间 * @param newSleepTime 新的休眠时间(毫秒) */ void onChangeSleepTime(const unsigned int newSleepTime); /** * @brief 控制线程运行状态 * @param isRunning true:运行 false:停止 */ void onThreadController(const bool &isRunning); /** * @brief 保存模型定义 * @param modelDefinition 模型定义 */ void onSaveModelDefinition(const QSharedPointer &modelDefinition); /** * @brief 开始监控指定变量 * @param varName 变量名 */ void onStartMonitoring(const QString &modelName, const QString &topicName, const QString &varName); /** * @brief 停止监控指定变量 * @param varName 变量名 */ void onStopMonitoring(const QString &modelName, const QString &topicName, const QString &varName); /** * @brief 暂停监控指定变量 * @param varName 变量名 */ void onPauseMonitoring(const QString &modelName, const QString &topicName, const QString &varName); /** * @brief 恢复监控指定变量 * @param varName 变量名 */ void onResumeMonitoring(const QString &modelName, const QString &topicName, const QString &varName); /** * @brief 注入一次性数据 * @param varName 变量名 * @param value 注入的值 */ void onInjectOnceData(const QString &modelName, const QString &topicName, const QString &varName, const double &value); /** * @brief 持续注入数据 * @param varName 变量名 * @param value 注入的值 */ void onInjectContinuousData(const QString &modelName, const QString &topicName, const QString &varName, const double &value); /** * @brief 停止持续注入数据 * @param varName 变量名 */ void onStopInjectContinuousData(const QString &modelName, const QString &topicName, const QString &varName); /** * @brief 退出线程 */ void onThreadQuit() { m_Quit = true; } protected: /** * @brief 线程运行函数 */ void run() override; private: /** * @brief 启动主题监控 * @param modelName 模型名 * @param topicName 主题名 * @return 是否启动成功 */ bool StartTopicMonitor(const QString &modelName, const QString &topicName); private: /** * @brief 模型名到模型定义的映射 */ QMap> m_StructDefinitionList; /** * @brief 变量名到监控状态的映射 */ QMap> m_VarNameMap; /** * @brief 变量名到注入值的映射 */ QMap> m_InjectValueMap; /** * @brief 线程休眠时间(毫秒) */ unsigned int m_SleepTime = 1000; /** * @brief 线程活动状态 */ bool m_Active = false; /** * @brief 线程退出标志 */ bool m_Quit = false; /** * @brief 互斥锁 */ QMutex m_Mutex; /** * @brief 模型名到主题监控器的映射 */ QMap> m_TopicMonitorMap; };