Files
handleaiuinew/HanddleAI/HandleAiUi-new/back/threadPoolController.cpp
T
2024-05-20 01:02:24 +08:00

459 lines
12 KiB
C++

#include <threadPoolController.h>
#include "camera_thread.h"
#include "myiothread.h"
#include <FrontendBackendBridge.h>
/// <summary>
/// 检查目标文件夹是否存在,不存在则创建
/// </summary>
/// <param name="path"></param>
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(&currentTime);
std::stringstream ss;
ss << std::put_time(localTime, "%H-%M-%S");
return ss.str();
}
int threadAmount = 0;
int maxThread = 16;
/// <summary>
/// 获取当前时间点,以"小时-分钟-秒"返回
/// </summary>
/// <returns></returns>
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(&currentTime);
std::stringstream ss;
ss << std::put_time(localTime, "%H-%M-%S");
return ss.str();
}
/// <summary>
/// 检查目标文件夹是否存在,不存在则创建
/// </summary>
/// <param name="path"></param>
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;
}