On main: V20260416-2.5.1

增加halconGuard类,用于防止halcon算法的输入输出和程序不一致而引起的报错,并且会检查算法文件是否存在,如不存在则会弹窗提示。
增加handleAiGpuThreadGuard类,用于防止因重复调用同一个模型而引起的报错,并且支持不停机更新模型,支持初始化时检测模型文件是否存在。
增加内存占用显示控件。
用户管理增加root权限,默认密码为dseuiroot,模型热更新时需要此权限。
支持缓存界面上的检测数据。
相机模块新增在回调后的指定时间没有取图时则清空容器的功能。
增加等待结果汇总功能,在启用时同一个SN的图片会等待总结果后再进行存图。
存图线程修改为多线程编码,单线程储存,提高IO效率。并且增加根据内存占用的百分比更新存图逻辑的功能,默认占用超过70%不储存OK原图,超过80%不储存原图,超过90%时不储存所有图片。
This commit is contained in:
2026-04-26 12:25:13 +08:00
parent b9899a1a00
commit 97462c8aab
174 changed files with 20592 additions and 2398 deletions
@@ -1,10 +1,12 @@
#include "Hd_CameraModule_HIK_General.h"
#include <qtimer.h>
using namespace std;
#include <QTextCodec>
#include <thread>
#include <atomic>
#include <chrono>
#include <mutex>
#include <qelapsedtimer.h>
enum statusEnum {
CONNECTED,
RECONNECTING,
@@ -29,7 +31,39 @@ int cameraIndex = -1;
QString lastError;
QQueue<cv::Mat> queuepic;
QMutex* n_mutex = new QMutex();
class callbackCollectTimeoutTimerClass : public QThread {
public:
void run() {
runFlag.store(true);
counter = 0;
while (runFlag.load() && counter < interval.load()) {
QThread::msleep(ontTimeSleepInterval);
counter += ontTimeSleepInterval;
}
if (runFlag.load() && counter >= interval.load())
timeoutAction();
}
void timeoutAction() {
QMutexLocker locker(n_mutex);
if (queuepic.size() > 0) {
queuepic.clear();
qDebug() << QString::fromStdString(Username) << "上次回调后未取图,已因超时清除缓存,interval" << interval;
std::cout << Username << "上次回调后未取图,已因超时清除缓存,interval" << interval << std::endl;
}
}
void setInterval(int msec) {
interval.store(msec);
}
void stop() {
runFlag.store(false);
}
private:
int counter = 0;
std::atomic<bool> runFlag = false;
std::atomic<int> interval = 1500;
int ontTimeSleepInterval = 10;
};
callbackCollectTimeoutTimerClass callbackCollectTimeoutTimer;
void* handle = NULL;
void CloseDevice();
@@ -183,6 +217,7 @@ void __stdcall ReconnectDevice(unsigned int nMsgType, void* pUser){
void __stdcall ImageCallBackEx(unsigned char* pData0, MV_FRAME_OUT_INFO_EX* pFrameInfo0, void* pUser0)
{
Q_UNUSED(pUser0)
callbackCollectTimeoutTimer.stop();
int frameNum = 0;
double time_Start = (double)clock();
QMutexLocker locker(n_mutex);
@@ -245,12 +280,14 @@ void __stdcall ImageCallBackEx(unsigned char* pData0, MV_FRAME_OUT_INFO_EX* pFra
srcImage = cv::Mat(5, 5, CV_8UC1).setTo(0);
}
queuepic.enqueue(srcImage);
callbackCollectTimeoutTimer.start();
if (queuepic.size() > 10)
queuepic.dequeue();
pData0 = { 0 };
double time_End = (double)clock();
qDebug() << "[INFO] " << __FUNCTION__ << " line:" << __LINE__ << " checkImg getImg,Time:" << (time_End - time_Start) << "ms"
<< "--CameraName:" << QString::fromStdString(Username) << " imgIndex:" << imgIndex << "nFrameNum : " << frameNum;
}
//关闭设备
@@ -280,10 +317,15 @@ void CloseDevice()
handle = nullptr;
}
Hd_CameraModule_HIK_General::Hd_CameraModule_HIK_General() {
}
Hd_CameraModule_HIK_General::~Hd_CameraModule_HIK_General()
{
runFlag = false;
// 防止定时线程在资源析构后仍访问队列和互斥锁
callbackCollectTimeoutTimer.stop();
// 等待重连线程结束
int waitCount = 0;
@@ -309,10 +351,10 @@ bool Hd_CameraModule_HIK_General::readData(std::vector<cv::Mat>& mat, QByteArray
{
return false;
}
callbackCollectTimeoutTimer.stop();
QMutexLocker locker(n_mutex);
cv::Mat img = queuepic.dequeue();
mat.push_back(img);
qDebug() << "[INFO] " << __FUNCTION__ << " line:" << __LINE__ << " checkImg readData--CameraName:" << QString::fromStdString(Username) << "--imgIndex : " << imgIndex;
return true;
}
@@ -332,11 +374,11 @@ bool Hd_CameraModule_HIK_General::writeData(std::vector<cv::Mat>& mat, QByteArra
data = lastError.toUtf8();
return true;
}
//if (data == "clearCache") {
// QMutexLocker locker(n_mutex);
// queuepic.clear();
// return true;
//}
if (data == "clearCache") {
QMutexLocker locker(n_mutex);
queuepic.clear();
return true;
}
if (data.contains("exposure")){
auto commandList = data.split('_');
QMutexLocker locker(n_mutex);
@@ -408,7 +450,7 @@ bool Hd_CameraModule_HIK_General::run()
bool Hd_CameraModule_HIK_General::checkStatus()
{
//status = moduleStatus;
return status;
return cameraStatus == CONNECTED;
}