#ifndef __THREADCOMPAREITEMMANAGER_H__ #define __THREADCOMPAREITEMMANAGER_H__ #include "spdlog/spdlog.h" #include "FromWebAPI.h" #include "CompareItemThread.h" /** 对比项管理线程 1、这个线程类定时获取数据库中对比项的信息,与正在运行的对比项线程对比, 找出需要新增的对比项、需要更新的对比项和需要删除的对比项。 2、在创建对比项线程的时候套了一层壳,在 thread_compareItem 函数中创建新的对比项线程实例, 这样可以避免 Qt 报线程归属权错误。 3、这个线程也会定时获取计划信息,更新给对比项 */ #define CompareItemManager ThreadCompareItemManager::instance() class ThreadCompareItemManager { ThreadCompareItemManager(); ThreadCompareItemManager(const ThreadCompareItemManager&) = delete; ThreadCompareItemManager& operator=(const ThreadCompareItemManager&) = delete; public: ~ThreadCompareItemManager(); static ThreadCompareItemManager& instance() { static ThreadCompareItemManager instance; return instance; } /* 对比项管理器线程函数 */ void thread_CompareItemManager(); /* 添加对比项实例 */ void addCompareItemThread(CompareItemThread* pThread); /* 通过对比项ID和通道ID获取声卡通道信息 */ SoundCardRoadInfo_t getSoundCardRoadInfo(int compareItemID, int roadNum); /* 给对比项套一层壳,这个函数就是新的线程,在里面new出新的对比项实例,防止Qt报线程归属权错误, 在函数中将对比项实例插入到线程管理器中 */ static void thread_compareItem(CalculateThreadInfo_t threadInfo); private: /* 更新基础设置信息,如数据库设置,噪音参数等 */ bool updateBaseSettings(); /* ---------------------- 对比项信息 ---------------------- */ /* 更新对比项信息 */ void processCompareItemInfo(); /* 处理对比项信息,新获取的和已有的对比 */ void checkCompareItemInfo(QList& createList, QList& updateList, QList& deleteList); /* 处理需要删除的对比项线程 */ void processDeleteCompareItemThreads(const QList& deleteList); /* 更新正在运行的线程信息 */ void updateRunningThreads(const QList& updateList); /* 创建新的线程 */ bool createNewCompareItemThreads(const QList& createList); /* ---------------------- 检测时段信息 ---------------------- */ /* 处理检测时段信息 */ void processDetectPeriodInfo(); /* 检查获取出更新的对比项信息 */ void checkDetectPeriodInfo(QMap newDetectInfo, QMap& updateList); private: std::shared_ptr m_logger = nullptr; FromWebAPI m_fromWebAPI; /* WebAPI处理类 */ QString m_webAPIUrl; /* WebAPI地址 */ QString m_webAPIID; /* WebAPI ID */ QString m_webAPIAppType; /* WebAPI应用类型 */ /* ---------------------- 对比项信息 ---------------------- */ std::mutex m_mutexCompareItemThreads; /* 对比项线程的互斥锁 */ QList m_listNewItems; /* 对比项列表,从数据库获取到的新的列表 */ QMap m_mapThreads; /* 对比项线程列表,key是对比项ID,value是对应的线程指针 */ /* 临时变量 */ QList m_listCreateItems; // 新创建的对比项列表 QList m_listUpdateItems; // 更新的对比项列表 QList m_listDeleteItems; // 删除的对比项列表 /* ---------------------- 检测时段信息 ---------------------- */ /* 检测时段,int是对比项ID */ QMap m_mapDetectPeriod; }; #endif