ThreadManager.h 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. #ifndef _THREADMANAGER_H_
  2. #define _THREADMANAGER_H_
  3. #include "spdlog/spdlog.h"
  4. #include "BaseRecordThread.h"
  5. #include "CreateDBPhaseThread.h"
  6. #include "GlobalVariable.h"
  7. #include "AudioData.h"
  8. #include "RingQueue.hpp"
  9. #include "RingQueueManualMutex.hpp"
  10. #include <list>
  11. class CreateWAVThread;
  12. class CalculateDBAndPhase;
  13. class ConsistencyCompareThread;
  14. class NoiseDetectThread;
  15. class CalculateDBPhaseThread;
  16. class RTPOneRoadThread;
  17. #define ThreadMan ThreadManager::getInstance()
  18. /**
  19. * @brief 线程管理类,这里只是提供线程的存储,释放和搜索功能
  20. *
  21. */
  22. class ThreadManager
  23. {
  24. ThreadManager();
  25. ThreadManager(const ThreadManager&) = delete; // 禁止拷贝构造
  26. ThreadManager& operator=(const ThreadManager&) = delete; // 禁止赋值操作
  27. public:
  28. ~ThreadManager() = default;
  29. static ThreadManager& getInstance()
  30. {
  31. static ThreadManager instance; // 局部静态变量,线程安全
  32. return instance;
  33. }
  34. /* 启动所有线程 */
  35. // void startAllThreads();
  36. /* 停止所有线程 */
  37. void stopAllThreads();
  38. /* 添加线程 */
  39. // void addThread(StRecordThreadInfo* pThreadInfo);
  40. /* 查找录音线程 */
  41. BaseRecordThread* findRecordThread(EThreadType type, int cardID, int recordID);
  42. /* -------------------------------------------------------------------------------------------
  43. * 获取录音线程,录音线程是统一创建的,有一路录音通道,就会有所有的对应的录音处理线程
  44. * -------------------------------------------------------------------------------------------- */
  45. /* 获取创建WAV线程指针 */
  46. CreateWAVThread* getCreateWAVThread(int cardID, int recordID);
  47. /* 获取创建音量值的线程 */
  48. CreateDBPhaseThread* getCreateDBPhaseThread(int cardID, int recordID);
  49. /* 获取发送Rtp数据的线程 */
  50. RTPOneRoadThread* getRtpSendThread(int cardID, int recordID);
  51. /* -------------------------------------------------------------------------------------------
  52. * 获取计算线程,如果该线程不存在则创建该线程
  53. * 当不需要此线程后,调用remove()函数去掉该线程
  54. * 补充:
  55. * 1、能在这里获取的线程是为了尽可能复用线程,这些都是和对比项无关的计算线程
  56. * 2、和对比项有关的计算线程由对比项线程启动和管理
  57. * -------------------------------------------------------------------------------------------- */
  58. /* 获取一致性比对线程,线程不存在则创建 */
  59. ConsistencyCompareThread* getConsistencyCompareThread(const SoundCardRoadInfo_t& roadInfo1, const SoundCardRoadInfo_t& roadInfo2);
  60. /* 去掉线程,线程使用的计数减一,计数为0则销毁该线程 */
  61. bool removeConsistencyCompareThread(SoundCardRoadInfo_t& roadInfo1, SoundCardRoadInfo_t& roadInfo2);
  62. /* 获取噪音检测线程,如果不存在,则创建线程 */
  63. NoiseDetectThread* getNoiseDetectThread(const SoundCardRoadInfo_t& roadInfo);
  64. /* 去掉噪音检测线程,线程使用的计数减一,计数为0则销毁该线程 */
  65. bool removeNoiseDetectThread(SoundCardRoadInfo_t& roadInfo);
  66. // /* 获取音量报警线程,如果不存在,则创建线程 */
  67. // CalculateDBPhaseThread* getCalculateDBPhaseThread(const SoundCardRoadInfo_t& roadInfo);
  68. // /* 去掉音量报警线程,线程使用的计数减一,计数为0则销毁该线程 */
  69. // bool removeCalculateDBPhaseThread(SoundCardRoadInfo_t& roadInfo);
  70. private:
  71. /* 录音线程队列 */
  72. std::list<BaseRecordThread*> m_recordThreads;
  73. /* 分派数据线程队列 */
  74. std::list<BaseRecordThread*> m_assignSrcDataThreads;
  75. /* 生成wav小文件线程队列 */
  76. std::list<BaseRecordThread*> m_createWAVThreads;
  77. /* 计算音量和反相线程队列 */
  78. std::list<BaseRecordThread*> m_createDBPhaseThreads;
  79. /* 生成长文件线程队列 */
  80. std::list<BaseRecordThread*> m_createLongWAVThreads;
  81. /* 发送Rtp数据的线程 */
  82. std::list<BaseRecordThread*> m_rtpSendThreads;
  83. /* 一致性比对的线程 */
  84. std::mutex m_mutexConsistencyCompareThreads; /* 互斥锁,保护一致性比对线程列表 */
  85. int m_referCountConsistencyCompare = 0; /* 一致性比对线程的引用计数 */
  86. std::list<ConsistencyCompareThread*> m_listConsistencyCompareThreads;
  87. /* 噪音检测线程 */
  88. std::mutex m_mutexNoiseDetectThreads; /* 互斥锁,保护噪音检测线程列表 */
  89. int m_referCountNoiseDetect = 0; /* 噪音检测线程的引用计数 */
  90. std::list<NoiseDetectThread*> m_listNoiseDetectThreads;
  91. /* 音量计算线程 */
  92. // std::mutex m_mutexCalculateDBPhaseThreads; /* 互斥锁,保护音量计算线程列表 */
  93. // int m_referCountCalculateDBPhase = 0; /* 音量计算线程的引用计数 */
  94. // std::list<CalculateDBPhaseThread*> m_listCalculateDBPhaseThreads;
  95. private:
  96. std::shared_ptr<spdlog::logger> m_logger = nullptr; /* 日志记录器 */
  97. std::string m_logBase; /* 日志基础信息 */
  98. };
  99. #endif // _THREADMANAGER_H_