CompareItemThread.h 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. #ifndef _COMPAREITEMTHREAD_H_
  2. #define _COMPAREITEMTHREAD_H_
  3. #include <map>
  4. #include <QObject>
  5. #include <QEventLoop>
  6. #include <QTimer>
  7. #include "BaseCalculateThread.h"
  8. #include "CompareResult.h"
  9. #include "FromMQTT.h"
  10. // #include "mqtt_client_cpp.hpp"
  11. class CalculateDBThread;
  12. class NoiseDetectThread;
  13. class CompareDoubleThread;
  14. /**
  15. 对比项功能线程
  16. 功能:
  17. 1、对比两个录音通道的数据,通道1是主通道,和其他通道挨个对比
  18. 2、从这里开启各个比对线程,获取比对结果信息,获取噪音检测结果,获取计算出的音量包信息,
  19. 组合成一个对比项的结果,发送到MQTT中
  20. 3、静音、过载、反相的报警信息从计算音量的线程中计算得出,并直接写入数据库,不再经过这里
  21. 一致性报警信息从两两对比线程中计算得出,直接写入数据库
  22. 噪音报警信息从噪音检测线程中计算得出,直接写入数据库
  23. 4、这里创建的线程包含:两两对比线程、音量检测线程,这两个都和对比项相关联
  24. 5、噪音检测线程从线程管理器中获取的,这里不负责创建和销毁
  25. 其他说明:
  26. 1、这个线程由于需要使用qmqtt发布数据,需要使用到Qt的事件循环,所以多继承了 QObject,
  27. 线程的使用权会交给 Qt 的事件循环来管理,通过定时器定时调用 task() 函数
  28. */
  29. class CompareItemThread : public QObject, public BaseCalculateThread
  30. {
  31. Q_OBJECT
  32. public:
  33. CompareItemThread(CalculateThreadInfo_t& threadInfo);
  34. ~CompareItemThread() override;
  35. /* 开启线程 */
  36. void threadTask() override;
  37. /* 停止线程 */
  38. void stopThread() override;
  39. void stopThreadBlock() override;
  40. protected:
  41. /* 线程功能函数,未使用这个函数 */
  42. void task() override;
  43. /* 功能函数,使用的是这个函数 */
  44. void timerTask();
  45. /* 初始化数据 */
  46. bool initData() override;
  47. /* 清理数据 */
  48. void clearData() override;
  49. /* 初始化MQTT */
  50. void initMQTT();
  51. private slots:
  52. /* 定时器槽函数 */
  53. void do_timeout();
  54. private:
  55. /* 创建两个对比线程,主通道是第一个通道,其他都需要和主通道进行对比 */
  56. bool createCompareThreads();
  57. /* 销毁两两对比线程 */
  58. void destroyCompareThreads();
  59. /* 创建计算音量报警的线程 */
  60. bool createCalculateDBThreads();
  61. /* 销毁音量计算的线程 */
  62. void destroyCalculateDBThreads();
  63. /* 获取噪音检测的线程 */
  64. bool getNoiseDetectThreads();
  65. /* 移除噪音检测的线程 */
  66. void removeNoiseDetectThreads();
  67. /* 更新数据 */
  68. bool updateResultData();
  69. /* 处理报警数据,写入数据库 */
  70. // void processAlarmData();
  71. /* 发送数据 */
  72. void sendResultData();
  73. /* 清除标志更新位 */
  74. void clearUpdateFlags();
  75. /* 生成发送至MQTT的JSON数据 */
  76. bool generateMQTTJsonData(const CompareResult_t& compareResult, QByteArray& jsonData);
  77. private:
  78. /* 事件循环 */
  79. QEventLoop m_eventLoop;
  80. /* 定时器 */
  81. QTimer* m_pTimer = nullptr;
  82. /* 发送音量包信息到mqtt中 */
  83. FromMQTT* m_pFromMQTT = nullptr;
  84. /* 发布的主题 */
  85. QString m_pubTopic;
  86. /* 计算音量信息的线程指针,第一个是主通道线程,int是对比项中的通道号 */
  87. std::map<int, CalculateDBThread*> m_mapCalculateDBThreads;
  88. /* 音量包更新标志位 */
  89. std::map<int, bool> m_mapCDBUpdated;
  90. /* 计算噪音的线程指针 */
  91. std::map<int, NoiseDetectThread*> m_mapNoiseDetectThreads;
  92. /* 对比项信息线程,这个线程在这里创建,不会和其他对比项复用,int是第二路对比通道的编号 */
  93. std::map<int, CompareDoubleThread*> m_mapCompareDoubleThreads;
  94. /* 计算的数据结果 */
  95. CompareResult_t m_compareResult;
  96. /* 存储报警信息,int是对比项中的通道编号 */
  97. // std::map<int, AlarmInfo_t> m_mapAlarmSilence; /* 静音报警信息 */
  98. // std::map<int, AlarmInfo_t> m_mapAlarmOverload; /* 过载报警信息 */
  99. // std::map<int, AlarmInfo_t> m_mapAlarmPhase; /* 反相报警信息 */
  100. // std::map<int, AlarmInfo_t> m_mapAlarmSilenceLast; /* 上一次静音报警信息 */
  101. // std::map<int, AlarmInfo_t> m_mapAlarmOverloadLast; /* 上一次过载报警信息 */
  102. // std::map<int, AlarmInfo_t> m_mapAlarmPhaseLast; /* 上一次反相报警信息 */
  103. /* 要写入到数据库的报警信息 */
  104. // std::list<AlarmInfo_t> m_listWriteAlarm;;
  105. };
  106. #endif // _COMPAREITEMTHREAD_H_