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);