|
@@ -5,6 +5,7 @@
|
|
|
#include "NoiseDetectThread.h"
|
|
|
#include "CompareDoubleThread.h"
|
|
|
#include "ThreadPool.h"
|
|
|
+#include "spdlog.h"
|
|
|
|
|
|
|
|
|
CompareItemThread::CompareItemThread(CalculateThreadInfo_t& threadInfo)
|
|
@@ -33,14 +34,14 @@ void CompareItemThread::task()
|
|
|
SPDLOG_LOGGER_INFO(m_logger, "----------------------------------------------------------------");
|
|
|
|
|
|
/* 测试录音通道用 */
|
|
|
- for(const auto& road : m_threadInfo.compareItemInfo.mapRoad)
|
|
|
- {
|
|
|
- ThreadMan.createRecordThread(road.scRoadInfo, m_threadInfo.compareItemInfo.nID);
|
|
|
- }
|
|
|
- while(true)
|
|
|
- {
|
|
|
- std::this_thread::sleep_for(std::chrono::milliseconds(100));
|
|
|
- }
|
|
|
+ // for(const auto& road : m_threadInfo.compareItemInfo.mapRoad)
|
|
|
+ // {
|
|
|
+ // ThreadMan.createRecordThread(road.scRoadInfo, m_threadInfo.compareItemInfo.nID);
|
|
|
+ // }
|
|
|
+ // while(true)
|
|
|
+ // {
|
|
|
+ // std::this_thread::sleep_for(std::chrono::milliseconds(100));
|
|
|
+ // }
|
|
|
|
|
|
|
|
|
/* 初始化数据 */
|
|
@@ -52,8 +53,8 @@ void CompareItemThread::task()
|
|
|
|
|
|
while (m_isRunning)
|
|
|
{
|
|
|
- /* 睡眠10ms */
|
|
|
- std::this_thread::sleep_for(std::chrono::milliseconds(10));
|
|
|
+ /* 睡眠100ms */
|
|
|
+ std::this_thread::sleep_for(std::chrono::milliseconds(100));
|
|
|
|
|
|
/* -------------------------------------------------------------------------------------
|
|
|
* 更新对比项信息
|
|
@@ -61,7 +62,8 @@ void CompareItemThread::task()
|
|
|
if(updateThreadInfoInternal())
|
|
|
{
|
|
|
SPDLOG_LOGGER_INFO(m_logger, "{} 暂停对比检测,更新对比项信息");
|
|
|
-
|
|
|
+ m_threadInfo.compareItemInfo = m_threadInfoNew.compareItemInfo;
|
|
|
+ initData();
|
|
|
SPDLOG_LOGGER_INFO(m_logger, "{} 更新对比项信息完成,继续检测对比");
|
|
|
}
|
|
|
|
|
@@ -78,10 +80,10 @@ void CompareItemThread::task()
|
|
|
* ------------------------------------------------------------------------------------- */
|
|
|
processAlarmData();
|
|
|
|
|
|
- /* -------------------------------------------------------------------------------------
|
|
|
+ /* -------------------------------------------------------------------------------------
|
|
|
* 将音量包数据发送到MQTT中
|
|
|
* ------------------------------------------------------------------------------------- */
|
|
|
-
|
|
|
+ sendResultData();
|
|
|
}
|
|
|
/* 清理数据 */
|
|
|
clearData();
|
|
@@ -106,12 +108,14 @@ bool CompareItemThread::initData()
|
|
|
getNoiseDetectThreads();
|
|
|
|
|
|
/* 创建两个对比线程,主通道是第一个通道,其他都需要和主通道进行对比 */
|
|
|
+ destroyCompareThreads();
|
|
|
if(!createCompareThreads())
|
|
|
{
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
/* 初始化存储结果的数据结构 */
|
|
|
+ m_compareResult = CompareResult_t();
|
|
|
m_compareResult.compareItemID = m_threadInfo.compareItemInfo.nID;
|
|
|
m_compareResult.compareItemName = m_threadInfo.compareItemInfo.strName.toStdString();
|
|
|
m_compareResult.dateTime = QDateTime::currentDateTime();
|
|
@@ -126,17 +130,24 @@ bool CompareItemThread::initData()
|
|
|
}
|
|
|
|
|
|
int roadCount = m_threadInfo.compareItemInfo.mapRoad.size();
|
|
|
- m_vecCDBPhaseUpdated.reserve(roadCount);
|
|
|
+ m_vecCDBUpdated.clear();
|
|
|
+ m_vecCDBUpdated.reserve(roadCount);
|
|
|
for(int i = 0; i < m_threadInfo.compareItemInfo.mapRoad.size(); ++i)
|
|
|
{
|
|
|
- m_vecCDBPhaseUpdated.push_back(false); // 初始化为未更新
|
|
|
+ m_vecCDBUpdated.push_back(false); // 初始化为未更新
|
|
|
}
|
|
|
|
|
|
/* 初始化报警信息 */
|
|
|
+ m_vecAlarmSilence.clear();
|
|
|
+ m_vecAlarmOverload.clear();
|
|
|
+ m_vecAlarmPhase.clear();
|
|
|
m_vecAlarmSilence.reserve(roadCount);
|
|
|
m_vecAlarmOverload.reserve(roadCount);
|
|
|
m_vecAlarmPhase.reserve(roadCount);
|
|
|
|
|
|
+ m_vecAlarmSilenceLast.clear();
|
|
|
+ m_vecAlarmOverloadLast.clear();
|
|
|
+ m_vecAlarmPhaseLast.clear();
|
|
|
m_vecAlarmSilenceLast.reserve(roadCount);
|
|
|
m_vecAlarmOverloadLast.reserve(roadCount);
|
|
|
m_vecAlarmPhaseLast.reserve(roadCount);
|
|
@@ -199,6 +210,28 @@ bool CompareItemThread::createCompareThreads()
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
+/* 销毁两两对比线程 */
|
|
|
+void CompareItemThread::destroyCompareThreads()
|
|
|
+{
|
|
|
+ if(m_vecCompareDoubleThreads.size() == 0)
|
|
|
+ {
|
|
|
+ return; // 没有对比线程
|
|
|
+ }
|
|
|
+ SPDLOG_LOGGER_INFO(m_logger, "{} 销毁对比线程", m_logBase);
|
|
|
+ for(auto& thread : m_vecCompareDoubleThreads)
|
|
|
+ {
|
|
|
+ if(thread != nullptr)
|
|
|
+ {
|
|
|
+ thread->stopThreadBlock(); // 停止线程
|
|
|
+ delete thread; // 删除线程
|
|
|
+ thread = nullptr; // 设置为nullptr
|
|
|
+ }
|
|
|
+ }
|
|
|
+ m_vecCompareDoubleThreads.clear();
|
|
|
+ m_vecCDBUpdated.clear(); // 清空更新标志位
|
|
|
+ SPDLOG_LOGGER_INFO(m_logger, "{} 对比线程销毁完成", m_logBase);
|
|
|
+}
|
|
|
+
|
|
|
/* 创建计算音量报警的线程 */
|
|
|
bool CompareItemThread::createCalculateDBThreads()
|
|
|
{
|
|
@@ -215,6 +248,7 @@ bool CompareItemThread::createCalculateDBThreads()
|
|
|
SPDLOG_LOGGER_ERROR(m_logger, "{} 创建音量计算线程失败", m_logBase);
|
|
|
// return false; // 获取线程失败
|
|
|
}
|
|
|
+ CPPTP.add_task(&CalculateDBThread::threadTask, pThread);
|
|
|
m_vecCalculateDBThreads.push_back(pThread);
|
|
|
}
|
|
|
|
|
@@ -224,6 +258,11 @@ bool CompareItemThread::createCalculateDBThreads()
|
|
|
/* 销毁音量计算的线程 */
|
|
|
void CompareItemThread::destroyCalculateDBThreads()
|
|
|
{
|
|
|
+ if(m_vecCalculateDBThreads.size() == 0)
|
|
|
+ {
|
|
|
+ return; // 没有音量计算线程
|
|
|
+ }
|
|
|
+ SPDLOG_LOGGER_INFO(m_logger, "{} 销毁音量计算线程", m_logBase);
|
|
|
for(auto& thread : m_vecCalculateDBThreads)
|
|
|
{
|
|
|
if(thread != nullptr)
|
|
@@ -234,7 +273,9 @@ void CompareItemThread::destroyCalculateDBThreads()
|
|
|
}
|
|
|
}
|
|
|
m_vecCalculateDBThreads.clear();
|
|
|
- m_vecCDBPhaseUpdated.clear(); // 清空更新标志位
|
|
|
+ m_vecCDBUpdated.clear(); // 清空更新标志位
|
|
|
+
|
|
|
+ SPDLOG_LOGGER_INFO(m_logger, "{} 音量计算线程销毁完成", m_logBase);
|
|
|
}
|
|
|
|
|
|
/* 获取噪音检测的线程 */
|
|
@@ -257,6 +298,11 @@ bool CompareItemThread::getNoiseDetectThreads()
|
|
|
/* 移除噪音检测的线程 */
|
|
|
void CompareItemThread::removeNoiseDetectThreads()
|
|
|
{
|
|
|
+ if(m_vecNoiseDetectThreads.size() == 0)
|
|
|
+ {
|
|
|
+ return; // 没有噪音检测线程
|
|
|
+ }
|
|
|
+ SPDLOG_LOGGER_INFO(m_logger, "{} 移除噪音检测线程", m_logBase);
|
|
|
for(auto& thread : m_vecNoiseDetectThreads)
|
|
|
{
|
|
|
if(thread != nullptr)
|
|
@@ -265,6 +311,7 @@ void CompareItemThread::removeNoiseDetectThreads()
|
|
|
}
|
|
|
}
|
|
|
m_vecNoiseDetectThreads.clear();
|
|
|
+ SPDLOG_LOGGER_INFO(m_logger, "{} 噪音检测线程移除完成", m_logBase);
|
|
|
}
|
|
|
|
|
|
|
|
@@ -278,10 +325,13 @@ void CompareItemThread::removeNoiseDetectThreads()
|
|
|
bool CompareItemThread::updateResultData()
|
|
|
{
|
|
|
const int size = m_threadInfo.compareItemInfo.mapRoad.size();
|
|
|
- /* 先从音量计算数据中获取音量包信息和报警信息 */
|
|
|
+
|
|
|
+ /* -------------------------------------------------------------------------------------
|
|
|
+ * 先从音量计算数据中获取音量包信息和报警信息(静音、过载、反相)
|
|
|
+ * ------------------------------------------------------------------------------------- */
|
|
|
for(int i = 0; i < size; ++i)
|
|
|
{
|
|
|
- if(m_vecCDBPhaseUpdated[i] == true)
|
|
|
+ if(m_vecCDBUpdated[i] == true)
|
|
|
{
|
|
|
continue; // 已经更新过了
|
|
|
}
|
|
@@ -294,7 +344,7 @@ bool CompareItemThread::updateResultData()
|
|
|
/* 获取最新的音量数据 */
|
|
|
if(pThread->getlastVolumeInfo(m_compareResult.vecRoadVolumes[i]))
|
|
|
{
|
|
|
- m_vecCDBPhaseUpdated[i] = true; // 标记为已更新
|
|
|
+ m_vecCDBUpdated[i] = true; // 标记为已更新
|
|
|
}
|
|
|
/* 更新报警信息 */
|
|
|
m_vecAlarmSilence[i] = pThread->getAlarm(EAlarmType::EAT_Silent);
|
|
@@ -304,14 +354,16 @@ bool CompareItemThread::updateResultData()
|
|
|
/* 判断是否全部更新,如果没有则返回,等待下次再次获取 */
|
|
|
for(int i = 0; i < size; ++i)
|
|
|
{
|
|
|
- if(m_vecCDBPhaseUpdated[i] == false)
|
|
|
+ if(m_vecCDBUpdated[i] == false)
|
|
|
{
|
|
|
// SPDLOG_LOGGER_DEBUG(m_logger, "{} 音量计算线程数据未全部更新,等待下次获取", m_logBase);
|
|
|
return false;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- /* 获取噪音计算的结果 */
|
|
|
+ /* -------------------------------------------------------------------------------------
|
|
|
+ * 获取噪音计算的结果
|
|
|
+ * ------------------------------------------------------------------------------------- */
|
|
|
for(int i = 0; i < size; ++i)
|
|
|
{
|
|
|
NoiseDetectThread* pThread = m_vecNoiseDetectThreads[i];
|
|
@@ -324,14 +376,16 @@ bool CompareItemThread::updateResultData()
|
|
|
m_compareResult.vecRoadVolumes[i].isNoise = pThread->isNoise();
|
|
|
}
|
|
|
|
|
|
- /* 从对比项中获取核对过后的结果 */
|
|
|
+ /* -------------------------------------------------------------------------------------
|
|
|
+ * 从对比项中获取核对过后的一致性结果
|
|
|
+ * ------------------------------------------------------------------------------------- */
|
|
|
for(int i = 1; i < size; ++i)
|
|
|
{
|
|
|
CompareDoubleThread* pThread = m_vecCompareDoubleThreads[i-1];
|
|
|
if(pThread == nullptr)
|
|
|
{
|
|
|
SPDLOG_LOGGER_ERROR(m_logger, "{} 获取对比线程失败", m_logBase);
|
|
|
- continue; // 跳过这个线程
|
|
|
+ continue;
|
|
|
}
|
|
|
/* 获取最新的一致性结果 */
|
|
|
OneRoadVolume_t roadVolume;
|