ThreadCompareItemManager.h 4.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. #ifndef __THREADCOMPAREITEMMANAGER_H__
  2. #define __THREADCOMPAREITEMMANAGER_H__
  3. #include "spdlog/spdlog.h"
  4. #include "FromWebAPI.h"
  5. #include "CompareItemThread.h"
  6. /**
  7. 对比项管理线程
  8. 1、这个线程类定时获取数据库中对比项的信息,与正在运行的对比项线程对比,
  9. 找出需要新增的对比项、需要更新的对比项和需要删除的对比项。
  10. 2、在创建对比项线程的时候套了一层壳,在 thread_compareItem 函数中创建新的对比项线程实例,
  11. 这样可以避免 Qt 报线程归属权错误。
  12. 3、这个线程也会定时获取计划信息,更新给对比项
  13. */
  14. #define CompareItemManager ThreadCompareItemManager::instance()
  15. class ThreadCompareItemManager
  16. {
  17. ThreadCompareItemManager();
  18. ThreadCompareItemManager(const ThreadCompareItemManager&) = delete;
  19. ThreadCompareItemManager& operator=(const ThreadCompareItemManager&) = delete;
  20. public:
  21. ~ThreadCompareItemManager();
  22. static ThreadCompareItemManager& instance()
  23. {
  24. static ThreadCompareItemManager instance;
  25. return instance;
  26. }
  27. /* 对比项管理器线程函数 */
  28. void thread_CompareItemManager();
  29. /* 添加对比项实例 */
  30. void addCompareItemThread(CompareItemThread* pThread);
  31. /* 通过对比项ID和通道ID获取声卡通道信息 */
  32. SoundCardRoadInfo_t getSoundCardRoadInfo(int compareItemID, int roadNum);
  33. /* 给对比项套一层壳,这个函数就是新的线程,在里面new出新的对比项实例,防止Qt报线程归属权错误,
  34. 在函数中将对比项实例插入到线程管理器中 */
  35. static void thread_compareItem(CalculateThreadInfo_t threadInfo);
  36. private:
  37. /* 更新基础设置信息,如数据库设置,噪音参数等 */
  38. bool updateBaseSettings();
  39. /* ---------------------- 对比项信息 ---------------------- */
  40. /* 更新对比项信息 */
  41. void processCompareItemInfo();
  42. /* 处理对比项信息,新获取的和已有的对比 */
  43. void checkCompareItemInfo(QList<CompareItemInfo_t>& createList,
  44. QList<CompareItemInfo_t>& updateList,
  45. QList<int>& deleteList);
  46. /* 处理需要删除的对比项线程 */
  47. void processDeleteCompareItemThreads(const QList<int>& deleteList);
  48. /* 更新正在运行的线程信息 */
  49. void updateRunningThreads(const QList<CompareItemInfo_t>& updateList);
  50. /* 创建新的线程 */
  51. bool createNewCompareItemThreads(const QList<CompareItemInfo_t>& createList);
  52. /* ---------------------- 检测时段信息 ---------------------- */
  53. /* 处理检测时段信息 */
  54. void processDetectPeriodInfo();
  55. /* 检查获取出更新的对比项信息 */
  56. void checkDetectPeriodInfo(QMap<int, DetectPeriodConfig_t> newDetectInfo, QMap<int, DetectPeriodConfig_t>& updateList);
  57. private:
  58. std::shared_ptr<spdlog::logger> m_logger = nullptr;
  59. FromWebAPI m_fromWebAPI; /* WebAPI处理类 */
  60. QString m_webAPIUrl; /* WebAPI地址 */
  61. QString m_webAPIID; /* WebAPI ID */
  62. QString m_webAPIAppType; /* WebAPI应用类型 */
  63. /* ---------------------- 对比项信息 ---------------------- */
  64. std::mutex m_mutexCompareItemThreads; /* 对比项线程的互斥锁 */
  65. QList<CompareItemInfo_t> m_listNewItems; /* 对比项列表,从数据库获取到的新的列表 */
  66. QMap<int, CompareItemThread*> m_mapThreads; /* 对比项线程列表,key是对比项ID,value是对应的线程指针 */
  67. /* 临时变量 */
  68. QList<CompareItemInfo_t> m_listCreateItems; // 新创建的对比项列表
  69. QList<CompareItemInfo_t> m_listUpdateItems; // 更新的对比项列表
  70. QList<int> m_listDeleteItems; // 删除的对比项列表
  71. /* ---------------------- 检测时段信息 ---------------------- */
  72. /* 检测时段,int是对比项ID */
  73. QMap<int, DetectPeriodConfig_t> m_mapDetectPeriod;
  74. };
  75. #endif