#include #include #include #include #include #include #include #include #include ////////////THREAD//Manager//////////////////////// detThreadManager::detThreadManager() { } void detThreadManager::initialization(detProcess* _appCore) { _imgSaveThreadManager = &_appCore->_imgSaveThreadManager; _triggerManager = &_appCore->_triggerManager; _handleAiModelManager = &_appCore->_handleAiModelManager; initFlag = true; this->start(); } void detThreadManager::process() { #pragma region 检查队列是否有新的数据 queueMutex.lock(); while (insertQueue.size() > 0) waitImgData.push_back(insertQueue.dequeue()); queueMutex.unlock(); #pragma endregion #pragma region 等待图片满足要求后,储存原图,异步执行算法函数 for (auto it = waitImgData.begin(); it != waitImgData.end();) { std::shared_ptr ptr = *it; if (ptr->oriImgs.size() >= ptr->imgAmountMin) { std::async(std::launch::async, &imgSaveThreadManager::saveOri,_imgSaveThreadManager, ptr); algoFutures.insert(std::make_pair(ptr->timeCode, std::async(std::launch::async, processAlgo, ptr,_handleAiModelManager))); processData.push_back(ptr); it = waitImgData.erase(it); } else ++it; } #pragma endregion #pragma region 执行完毕后异步获取储存使用结果 for (auto it = processData.begin(); it != processData.end();) { std::shared_ptr ptr = *it; futrueIte = algoFutures.find(ptr->timeCode); if (futrueIte->second.wait_for(zeroSec) == std::future_status::ready) { std::async(std::launch::async, &detThreadManager::resultHandle, this, ptr); it = processData.erase(it); algoFutures.erase(futrueIte); } else ++it; } #pragma endregion } void detThreadManager::resultHandle(std::shared_ptr data) { //for (auto func : resultHandleCallbacks) // func(data); if (data->algoThreadIndex < resultHandleCallbacks.size()) resultHandleCallbacks[data->algoThreadIndex](data); } void detThreadManager::run() { while (runFlag == true) { process(); QThread::msleep(1); } } void detThreadManager::addTask(std::shared_ptr data) { insertQueueMutex.lock(); insertQueue.enqueue(data); insertQueueMutex.unlock(); } detThreadManager::~detThreadManager() { runFlag = false; this->stop(); this->terminate(); processData.clear(); algoFutures.clear(); } ////////////////DET//DATA////////////////// sncodeCls::sncodeCls() { tcpStartPos = _core._appConfig._triggerStruct.startPos; } bool sncodeCls::clearSameSnRequestData() { std::unordered_map< size_t, size_t >tempMap; for (int i = snWaittingVec.size() - 1; i >= 0; i--) { auto it = tempMap.find(snWaittingVec[i].startpos); if (it == tempMap.end()) { tempMap.insert({ snWaittingVec[i].startpos,i }); } else { snWaittingVec.removeAt(i); return false; } } return true; } void sncodeCls::checkSnFromWaittingVec(QByteArray plcByte) { while (clearSameSnRequestData() == false); for (int i = 0; i < snWaittingVec.size(); i++) {//第一位是hash,第二位是index std::string SN = readSnFromQByteArray(plcByte, snWaittingVec[i].startpos, false, true, 0); if (SN.compare(snErrorsnError))//不为空 { snResList.push_back({ snWaittingVec[i].timecode,SN,snWaittingVec[i].startpos }); while (snResList.size() > 100) snResList.pop_front(); snWaittingVec.removeAt(i); } } } //FINS EDIT std::string sncodeCls::readSnFromQByteArray(QByteArray plcByte, int dmPos, bool highLowConversion, bool clearAfterRead, long long timeCode, int Size) { int triggerPos = (dmPos - tcpStartPos) * 2; if (triggerPos < 0) { std::cout << "Read SN error,trigger is DM:" << dmPos << ",but read start at DM:" << tcpStartPos << endl; return snErrorsnError; } QString str; if (plcByte.at(triggerPos + 1) == 0 && plcByte.at(triggerPos) == 0) return snErrorsnError; int snCount = 0; while (plcByte.at(snCount + triggerPos) != 0 || plcByte.at(snCount + triggerPos + 1) != 0) { if (plcByte.at(snCount + triggerPos) == 0) { snCount++; continue; } str += QChar(plcByte.at(snCount + triggerPos)); snCount++; } if (highLowConversion == true) { snHex(str); } if (str.size() < Size && Size != -1) return snErrorsnError; //if (clearAfterRead == true) // //for(int i=0;i< snCount;i++) // bridge.back.sendFinsMsg( //QString::fromStdString("writeALL_DM" + to_string(dmPos) + "_" + to_string(snCount) + "_0")); return str.toStdString(); } QString sncodeCls::snHex(QString sn) { QString resultStr = ""; for (int i = 0; i < sn.size() - 1; i = i + 2) { resultStr = resultStr + sn.at(i + 1) + sn.at(i); } return resultStr; } std::string sncodeCls::getData(unsigned long long timeCode) { for (int i = snResList.size() - 1; i >= 0; i--) { if (snResList[i].timecode == timeCode) return snResList[i].sn; } return snErrorsnError; } std::string sncodeCls::waitForSn(unsigned long long timeCode, int timeOut) { int cnt = 0; std::string sn = getData(timeCode); if (!sn.compare(snErrorsnError)) { while (cnt < timeOut) { sn = getData(timeCode); if (sn.compare(snErrorsnError)) { return sn; } cnt += 10; QThread::msleep(10); } } else return sn; return snErrorsnError; }