1、修复算法中输出图片因转换格式错误导致的崩溃问题

2、增加dump监测
master
bob.pan 4 years ago
parent b450f4e040
commit cc6cb8e306

@ -211,7 +211,7 @@ int CAlgorithmCompare::IImageAnalysis(class IImageObject* pImgObj)
if (bUseBackground == true && (matSrc.size().height != matBack.size().height || matSrc.size().width != matBack.size().width))
{
rltMap.insert("error", 0);
QImage srcImg = QtCVUtils::cvMatToQImage(matSrc);
QImage srcImg = cvMat2QImage(matSrc);//QtCVUtils::cvMatToQImage
rltMap.insert("srcImage", srcImg);
pImgObj->IVariantMapToUI(rltMap);
bReload = true;

@ -61,11 +61,11 @@ QImage CImageObject::IImage()
void CImageObject::IVariantMapToUI(const QVariantMap& vMap)
{
QString strSerial = m_pCamImg->Serial();
QFunctionTransfer::Instance()->execInMain([this, strSerial, vMap]() {
QVariantMap tmpMap = vMap;
QFunctionTransfer::Instance()->execInMain([this, strSerial, tmpMap]() {
if (lpCallBackFunc::instance()->m_ResultCallBackFunc)
{
lpCallBackFunc::instance()->m_ResultCallBackFunc(strSerial, vMap);
lpCallBackFunc::instance()->m_ResultCallBackFunc(strSerial, tmpMap);
}
});
}

@ -0,0 +1,129 @@
#ifndef _H_DUMPFILE_H_
#define _H_DUMPFILE_H_
/*!
*FileName: dumpfile.h
*Author: Pan Yingdong
*Email: bob.pan@hzleaper.com
*Created:2020/5/19 16:02
*Note:
*/
#include <windows.h>
#include <Dbghelp.h>
#include <iostream>
#include <vector>
#include <tchar.h>
#include <iomanip>
#include <ctime>
#include <chrono>
using namespace std;
using namespace std::chrono;
#pragma comment(lib, "Dbghelp.lib")
namespace NSDumpFile
{
void CreateDumpFile(LPCWSTR lpstrDumpFilePathName, EXCEPTION_POINTERS *pException)
{
// 创建Dump文件
//
HANDLE hDumpFile = CreateFile(lpstrDumpFilePathName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
// Dump信息
//
MINIDUMP_EXCEPTION_INFORMATION dumpInfo;
dumpInfo.ExceptionPointers = pException;
dumpInfo.ThreadId = GetCurrentThreadId();
dumpInfo.ClientPointers = TRUE;
// 写入Dump文件内容
//
MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hDumpFile, MiniDumpNormal, &dumpInfo, NULL, NULL);
CloseHandle(hDumpFile);
}
LPTOP_LEVEL_EXCEPTION_FILTER WINAPI MyDummySetUnhandledExceptionFilter(LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter)
{
return NULL;
}
BOOL PreventSetUnhandledExceptionFilter()
{
HMODULE hKernel32 = LoadLibrary(_T("kernel32.dll"));
if (hKernel32 == NULL)
return FALSE;
void *pOrgEntry = GetProcAddress(hKernel32, "SetUnhandledExceptionFilter");
if (pOrgEntry == NULL)
return FALSE;
unsigned char newJump[100];
DWORD dwOrgEntryAddr = (DWORD)pOrgEntry;
dwOrgEntryAddr += 5; // add 5 for 5 op-codes for jmp far
void *pNewFunc = &MyDummySetUnhandledExceptionFilter;
DWORD dwNewEntryAddr = (DWORD)pNewFunc;
DWORD dwRelativeAddr = dwNewEntryAddr - dwOrgEntryAddr;
newJump[0] = 0xE9; // JMP absolute
memcpy(&newJump[1], &dwRelativeAddr, sizeof(pNewFunc));
SIZE_T bytesWritten;
BOOL bRet = WriteProcessMemory(GetCurrentProcess(), pOrgEntry, newJump, sizeof(pNewFunc) + 1, &bytesWritten);
return bRet;
}
LONG WINAPI UnhandledExceptionFilterEx(struct _EXCEPTION_POINTERS *pException)
{
TCHAR szMbsFile[MAX_PATH] = { 0 };
::GetModuleFileName(NULL, szMbsFile, MAX_PATH);
TCHAR* pFind = _tcsrchr(szMbsFile, '\\');
if (pFind)
{
*(pFind + 1) = 0;
char buffer[80];
time_t rawtime;
struct tm info;
time(&rawtime);
localtime_s(&info, &rawtime);
TCHAR szMbsFile[MAX_PATH] = { 0 };
strftime(buffer, 80, "%Y-%m-%d %H-%M-%S", &info);
std::string strName = buffer;
strName += ".dmp";
_stprintf_s(szMbsFile, MAX_PATH, _T("%S"), strName.c_str());
CreateDumpFile(szMbsFile, pException);
}
// TODO: MiniDumpWriteDump
FatalAppExit(-1, _T("Fatal Error"));
return EXCEPTION_CONTINUE_SEARCH;
}
void RunCrashHandler()
{
SetUnhandledExceptionFilter(UnhandledExceptionFilterEx);
PreventSetUnhandledExceptionFilter();
}
};
#define DeclareDumpFile() NSDumpFile::RunCrashHandler();
/*
使
main
mainDeclareDumpFile()
*/
#endif

@ -3,10 +3,12 @@
#include "IMainWidget.h"
#include <QLibrary>
#include "QSignleApplication.h"
#include "dumpfile.h"
#pragma execution_character_set("utf-8")
int main(int argc, char *argv[])
{
DeclareDumpFile();
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
IMainWidget* pMain = nullptr;
QWidget* pMainWid = nullptr;

@ -275,6 +275,8 @@ lpMainWin::lpMainWin(QWidget *parent)
onLineseCheck(lpGlobalData::instance()->m_bCheckLinese);
tcpServerInit();
connect(this, SIGNAL(sgSendResultMsg(TP_PROTOCOL_MESSAGE)), this, SLOT(onSendResultMsg(TP_PROTOCOL_MESSAGE)));
}
lpMainWin::~lpMainWin()
@ -1713,7 +1715,7 @@ void lpMainWin::onSaveValveResult(ValueResult &rlt)
QString errorSourceDir = fileSavePath + "\\Error";
filename = QString("%1_%2").arg(strModeName).arg(QDateTime::currentDateTime().toString("hh-mm-ss zzz"));
errorSourceDir += "\\ValueImg";
QString resultpath = errorSourceDir + "\\" + filename + ".jepg";
QString resultpath = errorSourceDir + "\\" + filename + ".jpeg";
rlt.strImagePath = resultpath;
if(lpGlobalConfig::instance()->bSaveSrcNGImg_value == true)
saveImage(rlt.pixmap, errorSourceDir + "\\", filename + ".jpeg");
@ -1818,6 +1820,34 @@ void lpMainWin::sendWebAlgRlt(const ValueResult& rlt)
msg.body = sAlgRltObj;
tcp_server_ptr_->ISendMessage("*", msg);
}
/*
auto runTask = [&](ValueResult res)
{
QJsonObject sAlgRltObj;
sAlgRltObj.insert("cmd", "algRlt");
sAlgRltObj.insert("modeName", res.strModel);
sAlgRltObj.insert("score", res.score);
sAlgRltObj.insert("angle", res.angle);
sAlgRltObj.insert("center_x", res.center.x());
sAlgRltObj.insert("center_y", res.center.y());
sAlgRltObj.insert("imagePath", res.strImagePath);
sAlgRltObj.insert("resultType", res.resultType);
QByteArray imgBuf;
QBuffer buf(&imgBuf);
QPixmap img = res.pixmap.copy();
img.save(&buf);
QString strBase64 = QString(imgBuf.toBase64());
buf.close();
sAlgRltObj.insert("imageData_base64", strBase64);
TP_PROTOCOL_MESSAGE msg;
msg.body = sAlgRltObj;
emit sgSendResultMsg(msg);
};
std::thread t(runTask, rlt);
*/
}
QJsonObject lpMainWin::byte2Json(QByteArray data)
@ -2137,3 +2167,12 @@ void lpMainWin::AckTriggerCam()
tcp_server_ptr_->ISendMessage("*", msg);
}
}
Q_SLOT void lpMainWin::onSendResultMsg(TP_PROTOCOL_MESSAGE msg)
{
if (tcp_server_ptr_)
{
tcp_server_ptr_->ISendMessage("*", msg);
}
}

@ -75,7 +75,10 @@ signals:
void sgNetData(int, QVariantMap);
void sgAutoExposure();
void sgShowDetectLog(QString strLog);
void sgSendResultMsg(TP_PROTOCOL_MESSAGE msg);
private:
Q_SLOT void onSendResultMsg(TP_PROTOCOL_MESSAGE msg);
Q_SLOT void onLogInOut(QString strName, int level, int state);
Q_SLOT void onActionClicked();//工具栏按钮事件
Q_SLOT void onButtonClicked();//按钮事件
@ -147,6 +150,7 @@ private:
void paraJson(const QJsonObject& obj);
void onShowMainWindow();
void AckTriggerCam();
protected:
virtual void timerEvent(QTimerEvent *event);
virtual void closeEvent(QCloseEvent *event);

Loading…
Cancel
Save