diff --git a/BaseModules/Hd_3DCameraLMI_module_PointCloud/Hd_3DCameraLMI_module.cpp b/BaseModules/Hd_3DCameraLMI_module_PointCloud/Hd_3DCameraLMI_module.cpp index 77827547..f9235639 100644 --- a/BaseModules/Hd_3DCameraLMI_module_PointCloud/Hd_3DCameraLMI_module.cpp +++ b/BaseModules/Hd_3DCameraLMI_module_PointCloud/Hd_3DCameraLMI_module.cpp @@ -2,6 +2,7 @@ #include QQueue> queuePic; QMutex* m_mutex; +bool triggerIng = false; bool recivingImage = false,frameStart = false; int lastFrameId = -1 ; long long frameStampCountStart = 0, frameStampCountEnd = 0; @@ -300,12 +301,19 @@ Hd_3DCameraLMI_module::Hd_3DCameraLMI_module() { m_mutex = new QMutex(); } - Hd_3DCameraLMI_module::~Hd_3DCameraLMI_module() { ExceptionCB(-1, NULL); } - +void Hd_3DCameraLMI_module::genBlackImg(std::vector& vecPic) +{ + cv::Mat blank_image1(1000, 1000, CV_8UC1, cv::Scalar(0, 0, 0)); + cv::Mat blank_image2(1000, 1000, CV_8UC1, cv::Scalar(0, 0, 0)); + vector dstvec; + dstvec.push_back(blank_image1); + dstvec.push_back(blank_image2); + vecPic.assign(dstvec.begin(), dstvec.end()); +} bool Hd_3DCameraLMI_module::sendData(std::vector& vecPic, QByteArray &data ) { @@ -320,12 +328,7 @@ bool Hd_3DCameraLMI_module::sendData(std::vector& vecPic, QByteArray &d if (queuePic.empty()) { //qDebug() << " [Error] " << " srcImage is null"; - cv::Mat blank_image1(100, 100, CV_8UC1, cv::Scalar(0, 0, 0)); - cv::Mat blank_image2(100, 100, CV_8UC1, cv::Scalar(0, 0, 0)); - vector dstvec; - dstvec.push_back(blank_image1); - dstvec.push_back(blank_image2); - vecPic.assign(dstvec.begin(), dstvec.end()); + genBlackImg(vecPic); m_mutex->unlock(); return false; } @@ -348,7 +351,6 @@ bool Hd_3DCameraLMI_module::reciveData(std::vector &, QByteArray &qbyte bool Hd_3DCameraLMI_module::initParas(QByteArray &) { - //return true; bool flag = InitLmi(id); //3Dåˆ�始化 m_status = flag ? OK : UnInit; if (!flag) @@ -378,20 +380,58 @@ bool Hd_3DCameraLMI_module::run() //qDebug() << "[info]" << __FUNCTION__ << " line:" << __LINE__ << " run start" << id; try { - int timeOut = 0; - queuePic.clear(); - while (timeOut < 500) + //方法1 超时机制 + // queuePic.clear(); + //int timeOut = 0; + //while (timeOut < 500)//ms + //{ + // m_mutex->lock(); + // if (queuePic.size() > 0) + // { + // result = true; + // m_mutex->unlock(); + // return true; + // } + // m_mutex->unlock(); + // timeOut ++; + // QThread::msleep(1);//修改了ç�¡çœ 1ms + //} + + //方法2 在下一次触å�‘时强制给上一次触å�‘补黑图 + m_mutex->lock(); + if (triggerIng == true)//ä»�然在处ç�†ä¸Šä¸€æ¬¡è§¦å�‘ + { + std::vectorimgs; + genBlackImg(imgs); + queuePic.enqueue(imgs); + m_mutex->unlock(); + int cnt = 0; + while (queuePic.size() > 0 || cnt < 100) + { + QThread::msleep(1); + cnt++; + if (cnt > 10) + qDebug() << "insert black img 2 long"; + } + } + else + { + triggerIng = true; + m_mutex->unlock(); + } + //强制给上一次触å�‘补黑图 结æ�Ÿ + while (true) { m_mutex->lock(); if (queuePic.size() > 0) { - result = true; + result = true; + triggerIng = false; m_mutex->unlock(); return true; } m_mutex->unlock(); - timeOut += 10; - QThread::msleep(10); + QThread::msleep(1); } } catch (QString ev) diff --git a/BaseModules/Hd_3DCameraLMI_module_PointCloud/Hd_3DCameraLMI_module.h b/BaseModules/Hd_3DCameraLMI_module_PointCloud/Hd_3DCameraLMI_module.h index 70854db1..ae672872 100644 --- a/BaseModules/Hd_3DCameraLMI_module_PointCloud/Hd_3DCameraLMI_module.h +++ b/BaseModules/Hd_3DCameraLMI_module_PointCloud/Hd_3DCameraLMI_module.h @@ -75,6 +75,7 @@ class Hd_3DCameraLMI_module:public Base { Q_OBJECT public: + void genBlackImg(std::vector& vecPic); Hd_3DCameraLMI_module(); virtual ~Hd_3DCameraLMI_module(); bool sendData(std::vector& vecPic,QByteArray&data); diff --git a/HanddleAI/HanddleAi/back/cameraManager.cpp b/HanddleAI/HanddleAi/back/cameraManager.cpp index 4ad7c530..d4e72636 100644 --- a/HanddleAI/HanddleAi/back/cameraManager.cpp +++ b/HanddleAI/HanddleAi/back/cameraManager.cpp @@ -47,7 +47,6 @@ void camera::run() { mutex.lock(); std::shared_ptr data = requestQueue.dequeue(); - trigger(); data->oriImgMutex.lock(); const unsigned long long timeCode = data->timeCode; while(1) diff --git a/HanddleAI/HanddleAi/back/cameraManager.h b/HanddleAI/HanddleAi/back/cameraManager.h index 6f9e7cd6..8dd1bab7 100644 --- a/HanddleAI/HanddleAi/back/cameraManager.h +++ b/HanddleAI/HanddleAi/back/cameraManager.h @@ -13,6 +13,7 @@ #include #include #include +#include //Ó²´¥·¢ÒªÇóÔÚ´¥·¢Ïà»úǰ¸ø³ö´¥·¢ÐźŠclass backEndManager; class camera : public QThread @@ -38,6 +39,8 @@ public: void captureImage(std::shared_ptr dataIn) { requestQueue.enqueue(dataIn); + std::thread([this]() {trigger();}).detach(); + } //Ïà»ú²Ù×÷ diff --git a/HanddleAI/HanddleAi/simpleTools/hardwareMonitor.hpp b/HanddleAI/HanddleAi/simpleTools/hardwareMonitor.hpp new file mode 100644 index 00000000..fb56fe39 --- /dev/null +++ b/HanddleAI/HanddleAi/simpleTools/hardwareMonitor.hpp @@ -0,0 +1,169 @@ +#include +#include +#include +#include +#include +class hardwareMonitor :public QThread +{ +public: + int outputCnt =10; + struct CPUUsage { + DWORD_PTR coreId; + double usage; + }; + struct oneTimeData + { + QString time; + std::vectorcpuState; + std::vectormemState; + }; + std::vector getCPUUsagePerCore() { + std::vector coreUsages; + int numCores = sysInfo.dwNumberOfProcessors; + std::vector idleTimes(numCores), kernelTimes(numCores), userTimes(numCores); + std::vector prevIdleTimes(numCores), prevKernelTimes(numCores), prevUserTimes(numCores); + + // ³õʼ»ñÈ¡ + GetSystemTimes(&prevIdleTimes[0], &prevKernelTimes[0], &prevUserTimes[0]); + + Sleep(100); + + // »ñÈ¡ÔÙ´ÎµÄ CPU ʱ¼ä + GetSystemTimes(&idleTimes[0], &kernelTimes[0], &userTimes[0]); + + for (int i = 0; i < numCores; ++i) { + ULARGE_INTEGER idleTime, kernelTime, userTime; + ULARGE_INTEGER prevIdleTime, prevKernelTime, prevUserTime; + + idleTime.LowPart = idleTimes[i].dwLowDateTime; + idleTime.HighPart = idleTimes[i].dwHighDateTime; + kernelTime.LowPart = kernelTimes[i].dwLowDateTime; + kernelTime.HighPart = kernelTimes[i].dwHighDateTime; + userTime.LowPart = userTimes[i].dwLowDateTime; + userTime.HighPart = userTimes[i].dwHighDateTime; + + prevIdleTime.LowPart = prevIdleTimes[i].dwLowDateTime; + prevIdleTime.HighPart = prevIdleTimes[i].dwHighDateTime; + prevKernelTime.LowPart = prevKernelTimes[i].dwLowDateTime; + prevKernelTime.HighPart = prevKernelTimes[i].dwHighDateTime; + prevUserTime.LowPart = prevUserTimes[i].dwLowDateTime; + prevUserTime.HighPart = prevUserTimes[i].dwHighDateTime; + + ULONGLONG totalIdle = idleTime.QuadPart - prevIdleTime.QuadPart; + ULONGLONG totalKernel = kernelTime.QuadPart - prevKernelTime.QuadPart; + ULONGLONG totalUser = userTime.QuadPart - prevUserTime.QuadPart; + + ULONGLONG total = totalKernel + totalUser; + + CPUUsage usage; + usage.coreId = i; + usage.usage = (total > 0) ? (static_cast(total - totalIdle) / total) * 100.0 : 0.0; + coreUsages.push_back(usage); + } + + return coreUsages; + } + std::vector getMemState() + { + MEMORYSTATUSEX memInfo; + memInfo.dwLength = sizeof(MEMORYSTATUSEX); + if (GlobalMemoryStatusEx(&memInfo)) { + // »ñÈ¡×ÜÎïÀíÄÚ´æºÍÒÑÓÃÄÚ´æ + DWORDLONG totalPhysical = memInfo.ullTotalPhys; + DWORDLONG usedPhysical = memInfo.ullTotalPhys - memInfo.ullAvailPhys; + + // »ñÈ¡×ÜÐéÄâÄÚ´æºÍÒÑÓÃÐéÄâÄÚ´æ + DWORDLONG totalVirtual = memInfo.ullTotalVirtual; + DWORDLONG usedVirtual = memInfo.ullTotalVirtual - memInfo.ullAvailVirtual; + + // ¼ÆËãÄÚ´æÕ¼ÓÃÂÊ + double physicalMemoryUsage = (static_cast(usedPhysical) / totalPhysical) * 100.0; + double virtualMemoryUsage = (static_cast(usedVirtual) / totalVirtual) * 100.0; + return { physicalMemoryUsage,virtualMemoryUsage }; + } + else + return { 0,0 }; + } + hardwareMonitor() + { + this->start(); + } + ~hardwareMonitor() + { + runFlag = false; + } + void writeCsv(std::vector&State) { + if (State.size() == 0) + { + std::cerr << "hwÊý¾ÝΪ¿Õ! " << std::endl; + return; + } + fileManager::createDirectoryIfNotExists("./Log"); + QString fileName("./Log/" + QDate::currentDate().toString("yyyy-MM-dd") + "hwMonitor.csv"); + QFile file(fileName); + bool isEmpty = !file.exists() || file.size() == 0; + // ´ò¿ªÎļþ½øÐÐдÈë + if (!file.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Append)) { + std::cerr << "ÎÞ·¨´ò¿ªÎļþ½øÐÐдÈë: " << file.errorString().toStdString() << std::endl; + return; + } + + QTextStream out(&file); + + // ±íÍ· + if(isEmpty == true) + { + QStringList headers; + headers.append("getTime"); + for (int i = 0; i < State[0].cpuState.size(); i++) + headers.append("CORE" + QString::number(i)); + headers.append("pMem,vMem"); + out << headers.join(",") << "\n"; + } + + // Ñ­»·Ð´ÈëÊý¾Ý + for(auto& data: State) + { + QStringList csvData; + csvData.append(data.time); + for (auto& cpuData : data.cpuState) + csvData.append(QString::number(cpuData.usage)); + for (auto& memuData : data.memState) + csvData.append(QString::number(memuData)); + out << csvData.join(",") << "\n"; + } + + // ¹Ø±ÕÎļþ + file.close(); + State.clear();//³É¹¦Ð´ÈëºóÇå³ý + } + void run() + { + //³õʼ»¯ + GetSystemInfo(&sysInfo); + //Ñ­»·¶ÁÈ¡ + std::vector< oneTimeData> datas; + while (runFlag) + { + oneTimeData _oneTimeData; + //CPUÕ¼Óà + _oneTimeData.cpuState = getCPUUsagePerCore(); + //ÄÚ´æÕ¼Óà + _oneTimeData.memState= getMemState(); + //¼Ç¼ʱ¼ä + _oneTimeData.time = QTime::currentTime().toString("HH:mm:ss"); + + QThread::msleep(10); + datas.push_back(_oneTimeData); + if (datas.size() > outputCnt) + { + writeCsv(datas); + } + + } + } +private: + SYSTEM_INFO sysInfo; + bool runFlag = true; +}; +#pragma once \ No newline at end of file