#include #include "camera_thread.h" #include "myiothread.h" #include /// /// 检查目标文件夹是否存在,不存在则创建 /// /// void createDirectoryIfNotExists_2(const std::string& path) { // 检查路径是否存在 if (!std::filesystem::exists(path)) { // 创建路径 std::filesystem::create_directories(path); //std::cout << "已创建文件夹: " << path << std::endl; } else {/* std::cout << "文件夹已存在: " << path << std::endl;*/ } } std::string getCurrentDateTime_2() { // 获取当前时间点 std::chrono::system_clock::time_point now = std::chrono::system_clock::now(); // 转换为字符串 std::time_t currentTime = std::chrono::system_clock::to_time_t(now); std::tm* localTime = std::localtime(¤tTime); std::stringstream ss; ss << std::put_time(localTime, "%H-%M-%S"); return ss.str(); } int threadAmount = 0; int maxThread = 16; /// /// 获取当前时间点,以"小时-分钟-秒"返回 /// /// std::string getCurrentDateTime() { // 获取当前时间点 std::chrono::system_clock::time_point now = std::chrono::system_clock::now(); // 转换为字符串 std::time_t currentTime = std::chrono::system_clock::to_time_t(now); std::tm* localTime = std::localtime(¤tTime); std::stringstream ss; ss << std::put_time(localTime, "%H-%M-%S"); return ss.str(); } /// /// 检查目标文件夹是否存在,不存在则创建 /// /// void createDirectoryIfNotExists(const std::string& path) { // 检查路径是否存在 if (!std::filesystem::exists(path)) { // 创建路径 std::filesystem::create_directories(path); //std::cout << "已创建文件夹: " << path << std::endl; } else {/* std::cout << "文件夹已存在: " << path << std::endl;*/ } } ////////////THREAD//CONTROLLER//////////////////////// threadConroller::threadConroller(QObject* parent) : QThread(parent) { //sql初始化 sql = new sqlController; sql->initPara(); //辅助线程初始化 oriSaveThread->oriThread = true; oriSaveThread->Init(this); resSaveThread->Init(this); threadAmount = bridge.back.json.algoThreads.algoDataMap.size(); for (int i = 0; i < threadAmount; i++) { algoThread* aT = new algoThread(); aT->Init(this); //QObject::connect(aT, &algoThread::subThreadStart, [&]() { // supportThread->start(); // }); algoThreadList.push_back(aT); } } void threadConroller::run() { return; while (1) { while (insertQueue.size() > 0) { insertQueueMutex.lock(); while (insertQueue.size() > 0) { imgWaitList.push_back(insertQueue.dequeue()); } insertQueueMutex.unlock(); } if (imgWaitList.size() > 0) { for (int i = 0; i < imgWaitList.size(); i++) { int imgSize = imgWaitList[i]->imgs.size(); int imgAmountMin = imgWaitList[i]->imgAmountMin; if (imgSize >= imgAmountMin) { int threadId = imgWaitList[i]->algoThreadIndex; if (threadId == -1) { cout << "threadId return -1 ,algoName " << imgWaitList[i]->algoThreadName.toStdString() << endl; imgWaitList.removeAt(i); return; } algoThreadList[threadId]->addDetTask(imgWaitList[i]); cout << "Size " << imgWaitList.size() << " delete " << i << endl; imgWaitList.erase(imgWaitList.begin() + i); for (auto& data : imgWaitList) { cout << "remain " << data->cameraKeyName.toStdString() << " " << data->algoThreadName.toStdString() << " " << data->cameraNameStr << endl; } break; } } } QThread::msleep(10); } } void threadConroller::addTask(detData* data) { cout << __LINE__ << "insert Data " << data ->timeCode<< endl; { algoThreadCls::datastruct _struct = bridge.back.json.algoThreads.getData(data->algoThreadName); data->algoThreadIndex = _struct.threadIndex; data->resShowIndex = _struct.showIndex; data->imgAmountMin = _struct.imgAmountMin; } { CameraListCls::datastruct _struct = bridge.back.json.camera.getData(data->cameraKeyName); data->oriShowIndex = _struct.showIndex; } insertQueueMutex.lock(); //insertQueue.push_back(data); int threadId = data->algoThreadIndex; if (threadId == -1) { cout << "threadId return -1 ,algoName " << data->algoThreadName.toStdString() << endl; return; } algoThreadList[threadId]->addDetTask(data); insertQueueMutex.unlock(); //this->start(); } bool threadConroller::getFreeThread() { #if 0 int index = 0; for (index = 0; index < threadPoolList.size(); index++) { if (threadPoolList[index]->isRunning() == false) { return true; } } for (index = 0; index < threadPoolList.size(); index++) { if (threadPoolList[index]->nextObj.isEmpty() == true) { return true; } } #endif return false; } bool threadConroller::addTaskFreeThread(detData* data) { #if 0 int index = 0; for (index = 0; index < threadPoolList.size(); index++) { if (threadPoolList[index]->isRunning() == false) { threadPoolList[index]->addDetTask(data); threadPoolList[index]->start(); return true; } } for (index = 0; index < threadPoolList.size(); index++) { if (threadPoolList[index]->nextObj.isEmpty() == true) { threadPoolList[index]->addDetTask(data); return true; } } #endif return false; } threadConroller::~threadConroller() { for (auto thread : algoThreadList) { thread->m_runFlag = false; while (thread->isRunning() == false); } for (auto thread : algoThreadList) { delete thread; } } ////////////////SUBTHREAD//////////////////////// bool folderExists(const std::string& folderPath) { return std::filesystem::is_directory(folderPath); } void imgSaveThread::Init(threadConroller* tC) { sql = tC->sql; snDatas = &tC->snDatas; } void imgSaveThread::saveOriginalImg(imgSaveStruct& data) { //根据时间获取大概路径 sqlTableDatas sqlRes = sql->selectSingleData("saveHour", data.SNcode);//查找之前的数据 std::string fileSavePath = bridge.back.json.imgSavePath.toStdString(); if (sqlRes.rowDatas.size() > 0 && sqlRes.rowDatas[0][0].value != "")//数据存在 { fileSavePath += "//yuantu//" + sqlRes.tableName + "//" + sqlRes.rowDatas[0][0].value + "H//"; } else//数据不存在 新建数据 { QDateTime currentDateTime = QDateTime::currentDateTime(); std::string ymd = currentDateTime.toString("yyyy-MM-dd").toStdString(); int h = currentDateTime.time().hour(); fileSavePath += "//yuantu//" + ymd + "//" + to_string(h) + "H//"; sql->addData(data.SNcode, { { "saveHour",to_string(h) } }); } if ((data.SNcode).length() != 0) fileSavePath += data.SNcode + "//"; else fileSavePath += "camera_" + data.cameraKeyName + "//"; createDirectoryIfNotExists_2(fileSavePath);//文件夹处理 std::string fileName; //while (folderExists(resPath) != true); //////////////// if (data.cameraKeyName.find("3D") != -1 && data.imgs.size() == 2) { fileName = data.cameraKeyName + "-" + "_time" + getCurrentDateTime_2(); cv::imwrite(fileSavePath + fileName + ".bmp", data.imgs[0]); cv::imwrite(fileSavePath + fileName + ".tiff", data.imgs[1]); } else { std::string fileName; data.cameraKeyName; for (int i = 0; i < data.imgs.size(); i++) { fileName = data.cameraKeyName + "-" + to_string(i) + "_time" + getCurrentDateTime_2() + ".bmp"; cv::imwrite(fileSavePath + fileName, data.imgs[i]); qDebug() << "[Debug]" << QString::fromStdString(data.cameraKeyName + " res:" + fileSavePath + fileName); //cout << resPath << fileName << endl; } } return; } void imgSaveThread::saveResultImg(imgSaveStruct& data) { try { //根据时间获取大概路径 sqlTableDatas sqlRes = sql->selectSingleData("saveHour", data.SNcode);//查找之前的数据 std::string fileSavePath = bridge.back.json.imgSavePath.toStdString(); if (sqlRes.rowDatas.size() > 0 && sqlRes.rowDatas[0][0].value != "")//数据存在 { fileSavePath += "//result//" + sqlRes.tableName + "//" + sqlRes.rowDatas[0][0].value + "H//"; } else//数据不存在 新建数据 { QDateTime currentDateTime = QDateTime::currentDateTime(); std::string ymd = currentDateTime.toString("yyyy-MM-dd").toStdString(); int h = currentDateTime.time().hour(); fileSavePath += "//result//" + ymd + "//" + to_string(h) + "H//"; sql->addData(data.SNcode, { { "saveHour",to_string(h) } }); } //有SN码就储存在SN码路径,无则储存在相机路径 if ((data.SNcode).length() != 0) fileSavePath += data.SNcode + "//"; else fileSavePath += "camera_" + data.cameraKeyName + "//"; createDirectoryIfNotExists_2(fileSavePath);//文件夹处理 std::string fileName; //while (folderExists(resPath) != true); //else { for (int i = 0; i < data.imgs.size(); i++) { fileName = data.cameraKeyName + "_" + getCurrentDateTime_2() + "_time" + to_string(i) + ".jpg"; cv::imwrite(fileSavePath + fileName, data.imgs[i]); qDebug() << "[Debug]" << QString::fromStdString(data.cameraKeyName + " ori:" + fileSavePath + fileName); } } } catch (...) { return; } } void imgSaveThread::run() { if (oriThread == false) while (m_runFlag == true) { while (resQueue.size() > 0) { resMutex.lock(); imgSaveStruct data = resQueue.dequeue(); resMutex.unlock(); saveResultImg(data); } QThread::msleep(10); } else while (m_runFlag == true) { while (oriQueue.size() > 0) { oriMutex.lock(); imgSaveStruct data = oriQueue.dequeue(); oriMutex.unlock(); saveOriginalImg(data); } QThread::msleep(10); } } ////////////////DET//DATA////////////////// sncodeCls::sncodeCls() { tcpStartPos = bridge.back.json.tcp.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 byte) { while (clearSameSnRequestData() == false); for (int i = 0; i < snWaittingVec.size(); i++) {//第一位是hash,第二位是index string SN = readSnFromQByteArray(byte, 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); } } } string sncodeCls::readSnFromQByteArray(QByteArray byte, int dmPos, bool highLowConversion, bool clearAfterRead, long long timeCode, int Size) { int triggerPos = (dmPos - tcpStartPos) * 2; if (triggerPos < 0) { cout << "Read SN error,trigger is DM:" << dmPos << ",but read start at DM:" << tcpStartPos << endl; return snErrorsnError; } QString str; if (byte.at(triggerPos + 1) == 0 && byte.at(triggerPos) == 0) return snErrorsnError; int snCount = 0; while (byte.at(snCount + triggerPos) != 0 || byte.at(snCount + triggerPos + 1) != 0) { if (byte.at(snCount + triggerPos) == 0) { snCount++; continue; } str += QChar(byte.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; } 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; } string sncodeCls::waitForSn(unsigned long long timeCode, int timeOut) { int cnt = 0; 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; }