#ifndef _COMPAREITEMTHREAD_H_ #define _COMPAREITEMTHREAD_H_ #include #include #include #include #include "BaseCalculateThread.h" #include "CompareResult.h" #include "FromMQTT.h" class CalculateDBThread; class NoiseDetectThread; class CompareDoubleThread; /** 对比项功能线程 功能: 1、对比两个录音通道的数据,通道1是主通道,和其他通道挨个对比 2、从这里开启各个比对线程,获取比对结果信息,获取噪音检测结果,获取计算出的音量包信息, 组合成一个对比项的结果,发送到MQTT中,MQTT订阅主题: LH_ACAServer/DB/0 3、静音、过载、反相的报警信息从计算音量的线程中计算得出,并直接写入数据库,不再经过这里 一致性报警信息从两两对比线程中计算得出,直接写入数据库 噪音报警信息从噪音检测线程中计算得出,直接写入数据库 4、这里创建的线程包含:两两对比线程、音量检测线程,这两个都和对比项相关联 5、噪音检测线程从线程管理器中获取的,这里不负责创建和销毁 其他说明: 1、这个线程由于需要使用qmqtt发布数据,需要使用到Qt的事件循环,所以多继承了 QObject, 线程的使用权会交给 Qt 的事件循环来管理,通过定时器定时调用 task() 函数 检测时间段说明 1、在这里判断是否是检测时间段,如果不是某一项的检测时间段,则设置对应的线程为非检测时间段,对应的检测线程 输出的结果会做对应的处理(如噪音检测会设置为非噪音,一致性检测设置为一致) */ class CompareItemThread : public QObject, public BaseCalculateThread { Q_OBJECT public: CompareItemThread(CalculateThreadInfo_t& threadInfo); ~CompareItemThread() override; /* 开启线程 */ void threadTask() override; /* 停止线程 */ void stopThread() override; void stopThreadBlock() override; /* 设置检测时段 */ void setDetectPeriod(const DetectPeriodConfig_t& detectPeriod); 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); /* 检查是否在检测时间段内,返回false,不开启检测 */ bool checkDetectPeriod(); 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; /* ---------------------- 检测时段 ---------------------- */ std::mutex m_mutexDetectPeriod; /* 检测时段互斥锁 */ // std::atomic_bool m_isDetectPeriodUpdated = false; /* 检测时段更新标志 */ DetectPeriodConfig_t m_detectPeriod; /* 检测时段配置 */ }; #endif // _COMPAREITEMTHREAD_H_