#ifndef _COMPAREITEMTHREAD_H_ #define _COMPAREITEMTHREAD_H_ #include #include #include #include #include "BaseCalculateThread.h" #include "CompareResult.h" #include "FromMQTT.h" // #include "mqtt_client_cpp.hpp" class CalculateDBThread; class NoiseDetectThread; class CompareDoubleThread; /** 对比项功能线程 功能: 1、对比两个录音通道的数据,通道1是主通道,和其他通道挨个对比 2、从这里开启各个比对线程,获取比对结果信息,获取噪音检测结果,获取计算出的音量包信息, 组合成一个对比项的结果,发送到MQTT中 3、静音、过载、反相的报警信息从计算音量的线程中计算得出,并直接写入数据库,不再经过这里 一致性报警信息从两两对比线程中计算得出,直接写入数据库 噪音报警信息从噪音检测线程中计算得出,直接写入数据库 4、这里创建的线程包含:两两对比线程、音量检测线程,这两个都和对比项相关联 5、噪音检测线程从线程管理器中获取的,这里不负责创建和销毁 其他说明: 1、这个线程由于需要使用qmqtt发布数据,需要使用到Qt的事件循环,所以多继承了 QObject, 线程的使用权会交给 Qt 的事件循环来管理,通过定时器定时调用 task() 函数 */ class CompareItemThread : public QObject, public BaseCalculateThread { Q_OBJECT public: CompareItemThread(CalculateThreadInfo_t& threadInfo); ~CompareItemThread() override; /* 开启线程 */ void threadTask() override; /* 停止线程 */ void stopThread() override; void stopThreadBlock() override; protected: /* 线程功能函数,未使用这个函数 */ void task() override; /* 功能函数,使用的是这个函数 */ void timerTask(); /* 初始化数据 */ bool initData() override; /* 清理数据 */ void clearData() override; /* 初始化MQTT */ void initMQTT(); private slots: /* 定时器槽函数 */ void do_timeout(); private: /* 创建两个对比线程,主通道是第一个通道,其他都需要和主通道进行对比 */ bool createCompareThreads(); /* 销毁两两对比线程 */ void destroyCompareThreads(); /* 创建计算音量报警的线程 */ bool createCalculateDBThreads(); /* 销毁音量计算的线程 */ void destroyCalculateDBThreads(); /* 获取噪音检测的线程 */ bool getNoiseDetectThreads(); /* 移除噪音检测的线程 */ void removeNoiseDetectThreads(); /* 更新数据 */ bool updateResultData(); /* 处理报警数据,写入数据库 */ // void processAlarmData(); /* 发送数据 */ void sendResultData(); /* 清除标志更新位 */ void clearUpdateFlags(); /* 生成发送至MQTT的JSON数据 */ bool generateMQTTJsonData(const CompareResult_t& compareResult, QByteArray& jsonData); private: /* 事件循环 */ QEventLoop m_eventLoop; /* 定时器 */ QTimer* m_pTimer = nullptr; /* 发送音量包信息到mqtt中 */ FromMQTT* m_pFromMQTT = nullptr; /* 发布的主题 */ QString m_pubTopic; /* 计算音量信息的线程指针,第一个是主通道线程,int是对比项中的通道号 */ std::map m_mapCalculateDBThreads; /* 音量包更新标志位 */ std::map m_mapCDBUpdated; /* 计算噪音的线程指针 */ std::map m_mapNoiseDetectThreads; /* 对比项信息线程,这个线程在这里创建,不会和其他对比项复用,int是第二路对比通道的编号 */ std::map m_mapCompareDoubleThreads; /* 计算的数据结果 */ CompareResult_t m_compareResult; /* 存储报警信息,int是对比项中的通道编号 */ // std::map m_mapAlarmSilence; /* 静音报警信息 */ // std::map m_mapAlarmOverload; /* 过载报警信息 */ // std::map m_mapAlarmPhase; /* 反相报警信息 */ // std::map m_mapAlarmSilenceLast; /* 上一次静音报警信息 */ // std::map m_mapAlarmOverloadLast; /* 上一次过载报警信息 */ // std::map m_mapAlarmPhaseLast; /* 上一次反相报警信息 */ /* 要写入到数据库的报警信息 */ // std::list m_listWriteAlarm;; }; #endif // _COMPAREITEMTHREAD_H_