ThreadCompareItemManager.h 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. #ifndef __THREADCOMPAREITEMMANAGER_H__
  2. #define __THREADCOMPAREITEMMANAGER_H__
  3. #include "GlobalVariable.h"
  4. #include "spdlog/spdlog.h"
  5. #include "FromWebAPI.h"
  6. #include "CompareItemThread.h"
  7. #include <QObject>
  8. #include <QEventLoop>
  9. #include <QTimer>
  10. #include <string>
  11. class FromMQTT;
  12. /**
  13. 对比项管理线程
  14. 1、这个线程类定时获取数据库中对比项的信息,与正在运行的对比项线程对比,
  15. 找出需要新增的对比项、需要更新的对比项和需要删除的对比项。
  16. 2、在创建对比项线程的时候套了一层壳,在 thread_compareItem 函数中创建新的对比项线程实例,
  17. 这样可以避免 Qt 报线程归属权错误。
  18. 3、这个线程也会定时获取计划信息,更新给对比项
  19. */
  20. #define CompareItemManager ThreadCompareItemManager::instance()
  21. class ThreadCompareItemManager : public QObject
  22. {
  23. Q_OBJECT
  24. ThreadCompareItemManager();
  25. ThreadCompareItemManager(const ThreadCompareItemManager&) = delete;
  26. ThreadCompareItemManager& operator=(const ThreadCompareItemManager&) = delete;
  27. public:
  28. ~ThreadCompareItemManager();
  29. static ThreadCompareItemManager& instance()
  30. {
  31. static ThreadCompareItemManager instance;
  32. return instance;
  33. }
  34. /* 对比项管理器线程函数 */
  35. void thread_CompareItemManager();
  36. /* 通过对比项ID和通道ID获取声卡通道信息 */
  37. OneSoundCardPCMInfo_t getSoundCardRoadInfo(int compareItemID, int roadNum);
  38. /* 给对比项套一层壳,这个函数就是新的线程,在里面new出新的对比项实例,防止Qt报线程归属权错误,
  39. 在函数中将对比项实例插入到线程管理器中 */
  40. static void thread_compareItem(CalculateThreadInfo_t threadInfo);
  41. private slots:
  42. /* 定时器触发,处理对比项信息 */
  43. void do_task();
  44. private:
  45. /* 添加对比项实例 */
  46. void addCompareItemThread(CompareItemThread* pThread);
  47. /* 更新基础设置信息,如数据库设置,噪音参数等 */
  48. bool updateBaseSettings();
  49. /* ---------------------- 对比项信息 ---------------------- */
  50. /* 更新对比项信息 */
  51. void processCompareItemInfo();
  52. /* 处理对比项信息,新获取的和已有的对比 */
  53. void checkCompareItemInfo( QList<CompareItemInfo_t>& newList,
  54. QList<CompareItemInfo_t>& createList,
  55. // QList<CompareItemInfo_t>& updateList,
  56. QList<int>& deleteList);
  57. /* 处理需要删除的对比项线程 */
  58. void processDeleteCompareItemThreads(const QList<int>& deleteList);
  59. /* 更新正在运行的线程信息 */
  60. void updateRunningThreads(const QList<CompareItemInfo_t>& updateList);
  61. /* 创建新的线程 */
  62. bool createNewCompareItemThreads(const QList<CompareItemInfo_t>& createList);
  63. /* ---------------------- 检测时段信息 ---------------------- */
  64. /* 处理检测时段信息 */
  65. void processDetectPeriodInfo();
  66. /* 检查获取出更新的对比项信息 */
  67. void checkDetectPeriodInfo(QMap<int, DetectPeriodConfig_t>& nowDetectInfo, QMap<int, DetectPeriodConfig_t> newDetectInfo, QMap<int, DetectPeriodConfig_t>& updateList);
  68. /* ---------------------- 向MQTT发送对比项信息 ---------------------- */
  69. /* 更新对比项信息到MQTT */
  70. void updateCompareItemInfoToMQTT();
  71. /* 发送到MQTT */
  72. void sendCompareItemInfoToMQTT(const QMap<int, CompareItemInfo_t>& mapCompareItem);
  73. /* 初始化MQTT */
  74. void initMQTT();
  75. private:
  76. std::shared_ptr<spdlog::logger> m_logger = nullptr;
  77. QEventLoop* m_pEventLoop = nullptr; // 事件循环
  78. QTimer* m_pTimer = nullptr; // 定时器
  79. FromMQTT* m_pFromMQTT = nullptr; // MQTT处理发送类
  80. QString m_pubTopic; /* 发布的主题 */
  81. FromWebAPI m_fromWebAPI; /* WebAPI处理类 */
  82. QString m_webAPIUrl; /* WebAPI地址 */
  83. QString m_webAPIID; /* WebAPI ID */
  84. QString m_webAPIAppType; /* WebAPI应用类型 */
  85. /* ---------------------- 对比项信息 ---------------------- */
  86. std::atomic_bool m_isOneSend = true; /* 开启服务先发送一次 */
  87. std::mutex m_mutexCompareItemThreads; /* 对比项线程的互斥锁 */
  88. // QList<CompareItemInfo_t> m_listNewItems; /* 对比项列表,从数据库获取到的新的列表 */
  89. QMap<int, CompareItemInfo_t> m_mapNowCompareItem; /* 当前的对比项信息,在检查是否有对比项更新的时候更新该值 */
  90. QMap<int, CompareItemThread*> m_mapThreads; /* 对比项线程列表,key是对比项ID,value是对应的线程指针 */
  91. /* 临时变量 */
  92. QList<CompareItemInfo_t> m_listCreateItems; // 新创建的对比项列表
  93. QList<CompareItemInfo_t> m_listUpdateItems; // 更新的对比项列表
  94. QList<int> m_listDeleteItems; // 删除的对比项列表
  95. /* ---------------------- 检测时段信息 ---------------------- */
  96. /* 检测时段,int是对比项ID */
  97. QMap<int, DetectPeriodConfig_t> m_mapDetectPeriod;
  98. /* ---------------------- 向MQTT发送对比项信息 ---------------------- */
  99. QMap<int, CompareItemInfo_t> m_mapMQTTItemInfo;
  100. };
  101. #endif