XNSim/XNMonitor/DataMonitorWidget/DataMonitorThread.h
2025-04-28 12:25:20 +08:00

145 lines
3.6 KiB
C++
Executable File

#pragma once
#include <QThread>
#include <QString>
#include <QMap>
#include <QMutex>
#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> &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<QString, QSharedPointer<StructDefinition>> m_StructDefinitionList;
/**
* @brief 变量名到监控状态的映射
*/
QMap<QString, QMap<QString, unsigned int>> m_VarNameMap;
/**
* @brief 变量名到注入值的映射
*/
QMap<QString, QMap<QString, double>> m_InjectValueMap;
/**
* @brief 线程休眠时间(毫秒)
*/
unsigned int m_SleepTime = 1000;
/**
* @brief 线程活动状态
*/
bool m_Active = false;
/**
* @brief 线程退出标志
*/
bool m_Quit = false;
/**
* @brief 互斥锁
*/
QMutex m_Mutex;
/**
* @brief 模型名到主题监控器的映射
*/
QMap<QString, QSharedPointer<TopicMonitor>> m_TopicMonitorMap;
};