From 16f0d4f4c8dc3c8b75f7818583d7118d05c7e34e Mon Sep 17 00:00:00 2001 From: RCi <15089880081@163.com> Date: Fri, 24 May 2024 00:55:08 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=E9=83=A8=E5=88=86=E7=AE=97?= =?UTF-8?q?=E6=B3=95=E7=BA=BF=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../HandleAiUi-new/algo/algorithmThread.cpp | 2 +- .../HandleAiUi-new/back/cameraManager.cpp | 36 ----------- .../HandleAiUi-new/back/threadPoolManager.cpp | 61 +++++++++++-------- .../HandleAiUi-new/back/threadPoolManager.h | 17 ++---- 4 files changed, 44 insertions(+), 72 deletions(-) diff --git a/HanddleAI/HandleAiUi-new/algo/algorithmThread.cpp b/HanddleAI/HandleAiUi-new/algo/algorithmThread.cpp index 4475d2d3..4e0ccd13 100644 --- a/HanddleAI/HandleAiUi-new/algo/algorithmThread.cpp +++ b/HanddleAI/HandleAiUi-new/algo/algorithmThread.cpp @@ -450,7 +450,7 @@ void calculateLineSegmentDistances(const std::vector= 0) { sumDistance += distance; - std::cout << "Minimum distansssdce: " << distance * 0.014744 << std::endl; + std::cout << "Minimum dist ssdce: " << distance * 0.014744 << std::endl; if (distance < minDistance) { minDistance = distance; } diff --git a/HanddleAI/HandleAiUi-new/back/cameraManager.cpp b/HanddleAI/HandleAiUi-new/back/cameraManager.cpp index 59309b3f..fa43cd4a 100644 --- a/HanddleAI/HandleAiUi-new/back/cameraManager.cpp +++ b/HanddleAI/HandleAiUi-new/back/cameraManager.cpp @@ -43,42 +43,6 @@ void camera::run() std::vectorcamera_mat; while (runFlag) { - //getCameraImg(camera_mat); - //while(camera_mat.size()>0) - //{ - // int size = imgQueue.size(); - // for (auto img : camera_mat) - // { - // imgQueue.enqueue(img); - // if (lastUpdateTime.elapsed() > 200)//显示在界面 - // { - // lastUpdateTime.start(); // 记录本次更新时间 - // QPixmap pixmap; - // cvMatToQPixMap(img, pixmap); - // showImgPack* pack = new showImgPack(); - // pack->img = pixmap; - // pack->type = imgWidgetOri; - // pack->index = index; - // emit S1(pack); - // } - // else - // { - // showLost++; - // qDebug() << cameraModulePtr.moduleName << "Lost show"; - // } - // camera_mat.clear(); - // } - - // //防止过大 - // while (imgQueue.size() > 5) - // { - // imgQueue.dequeue(); - // imgLost++; - // qDebug() << cameraModulePtr.moduleName << "Lost img"; - // } - // - // getCameraImg(camera_mat); - //} int queueSize = requestQueue.size() ; if (queueSize >0) { diff --git a/HanddleAI/HandleAiUi-new/back/threadPoolManager.cpp b/HanddleAI/HandleAiUi-new/back/threadPoolManager.cpp index bbd2caa8..526ec5e9 100644 --- a/HanddleAI/HandleAiUi-new/back/threadPoolManager.cpp +++ b/HanddleAI/HandleAiUi-new/back/threadPoolManager.cpp @@ -48,43 +48,51 @@ threadManager::threadManager(QObject* parent) : QThread(parent) void threadManager::process() { + #pragma region 检查队列是否有新的数据 queueMutex.lock(); while (insertQueue.size() > 0) - processData.push_back(std::make_pair(progress::waitImg,insertQueue.dequeue())); + waitImgData.push_back(insertQueue.dequeue()); queueMutex.unlock(); #pragma endregion -#pragma region 检测状态并处理 - for (auto& data : processData) +#pragma region 等待图片满足要求后异步执行算法函数 + for (auto it = waitImgData.begin(); it != waitImgData.end();) { - std::shared_ptr detDataPtr = data.second; - switch (data.first) + std::shared_ptr ptr = *it; + if (ptr->imgs.size() >= ptr->imgAmountMin) { - case waitImg: - if (detDataPtr->imgs.size() >= detDataPtr->imgAmountMin) - { - futures.insert(std::make_pair(detDataPtr->timeCode,std::async(std::launch::async, pinAioEvalute, detDataPtr))); - data.first = processing; - } - break; - case processing: - auto futrue = futures.find(detDataPtr->timeCode); - if (futrue == futures.end()) - { - std::cout << "???????" << std::endl; - } - if (futrue->second.valid()) - { - //processData - } + futures.insert(std::make_pair(ptr->timeCode, std::async(std::launch::async, pinAioEvalute, ptr))); + it = waitImgData.erase(it); + processData.push_back(ptr); } + else + ++it; + } +#pragma endregion +#pragma region 执行完毕后异步获取储存使用结果 + for (auto it = processData.begin(); it != processData.end();) + { + std::shared_ptr ptr = *it; + futrueIte = futures.find(ptr->timeCode); + if (futrueIte->second.valid()) + { + it = processData.erase(it); // 删除元素后,更新迭代器 + futures.erase(futrueIte); + std::async(std::launch::async, &threadManager::resultHandle, this, ptr); + } + else + ++it; } #pragma endregion -} +} +void threadManager::resultHandle(std::shared_ptr ) +{ + +} void threadManager::run() { - while(1) + while (runFlag == true) { process(); QThread::msleep(1); @@ -103,6 +111,11 @@ void threadManager::addTask(std::shared_ptr data) } threadManager::~threadManager() { + runFlag = false; + this->stop(); + this->terminate(); + processData.clear(); + futures.clear(); } ////////////////DET//DATA////////////////// sncodeCls::sncodeCls() diff --git a/HanddleAI/HandleAiUi-new/back/threadPoolManager.h b/HanddleAI/HandleAiUi-new/back/threadPoolManager.h index 9ae42026..56b78bd6 100644 --- a/HanddleAI/HandleAiUi-new/back/threadPoolManager.h +++ b/HanddleAI/HandleAiUi-new/back/threadPoolManager.h @@ -218,20 +218,11 @@ public: sncodeCls(); }; -/// -/// 线程池管理 -/// class threadManager : public QThread { Q_OBJECT public: - enum progress - { - waitImg, - processing - }; - explicit threadManager(QObject* parent = nullptr); QQueue> detDataQueue; sqlManager* sql; @@ -246,6 +237,7 @@ public: runFlag = false; this->terminate(); } + void resultHandle(std::shared_ptr ); void addTask(std::shared_ptr ); sncodeCls snDatas; @@ -255,10 +247,13 @@ public: QMutex insertQueueMutex; QQueue>insertQueue; - std::vector>> processData; - std::unordered_map> futures; void process(); private: + std::list> waitImgData; + std::list> processData; + std::unordered_map> futures; + std::unordered_map>::iterator futrueIte; + bool runFlag = true; QList>imgWaitList; std::vector>deleteVec;