From cc6cb8e306b34fa828cd10c566f166afc808b4f6 Mon Sep 17 00:00:00 2001 From: "bob.pan" Date: Mon, 6 Dec 2021 11:43:28 +0800 Subject: [PATCH] =?UTF-8?q?1=E3=80=81=E4=BF=AE=E5=A4=8D=E7=AE=97=E6=B3=95?= =?UTF-8?q?=E4=B8=AD=E8=BE=93=E5=87=BA=E5=9B=BE=E7=89=87=E5=9B=A0=E8=BD=AC?= =?UTF-8?q?=E6=8D=A2=E6=A0=BC=E5=BC=8F=E9=94=99=E8=AF=AF=E5=AF=BC=E8=87=B4?= =?UTF-8?q?=E7=9A=84=E5=B4=A9=E6=BA=83=E9=97=AE=E9=A2=98=202=E3=80=81?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0dump=E7=9B=91=E6=B5=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/algorithm/AlgorithmCompare.cpp | 2 +- src/lpCoreCtrl/ImageObject.cpp | 6 +- tpvs17/Enchanter/dumpfile.h | 129 +++++++++++++++++++++++++++++ tpvs17/Enchanter/main.cpp | 2 + tpvs17/tpMain/lpMainWin.cpp | 41 ++++++++- tpvs17/tpMain/lpMainWin.h | 4 + 6 files changed, 179 insertions(+), 5 deletions(-) create mode 100644 tpvs17/Enchanter/dumpfile.h diff --git a/src/algorithm/AlgorithmCompare.cpp b/src/algorithm/AlgorithmCompare.cpp index 5b14481..30231da 100644 --- a/src/algorithm/AlgorithmCompare.cpp +++ b/src/algorithm/AlgorithmCompare.cpp @@ -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; diff --git a/src/lpCoreCtrl/ImageObject.cpp b/src/lpCoreCtrl/ImageObject.cpp index 5584848..34d0a0f 100644 --- a/src/lpCoreCtrl/ImageObject.cpp +++ b/src/lpCoreCtrl/ImageObject.cpp @@ -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); } }); } diff --git a/tpvs17/Enchanter/dumpfile.h b/tpvs17/Enchanter/dumpfile.h new file mode 100644 index 0000000..b90ac22 --- /dev/null +++ b/tpvs17/Enchanter/dumpfile.h @@ -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 +#include +#include +#include +#include +#include +#include +#include + +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文件中添加头文件 +main函数中调用DeclareDumpFile()即可 +*/ +#endif \ No newline at end of file diff --git a/tpvs17/Enchanter/main.cpp b/tpvs17/Enchanter/main.cpp index 2499b46..58b2c75 100644 --- a/tpvs17/Enchanter/main.cpp +++ b/tpvs17/Enchanter/main.cpp @@ -3,10 +3,12 @@ #include "IMainWidget.h" #include #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; diff --git a/tpvs17/tpMain/lpMainWin.cpp b/tpvs17/tpMain/lpMainWin.cpp index 7f53780..ba612d6 100644 --- a/tpvs17/tpMain/lpMainWin.cpp +++ b/tpvs17/tpMain/lpMainWin.cpp @@ -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); + } +} + diff --git a/tpvs17/tpMain/lpMainWin.h b/tpvs17/tpMain/lpMainWin.h index 414f04c..d21f505 100644 --- a/tpvs17/tpMain/lpMainWin.h +++ b/tpvs17/tpMain/lpMainWin.h @@ -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);