mrDarker
2025-08-16 5e802e47375cb399b91f0abdc95420d6cce0b18b
1. 添加一个线程类,保存全图使用队列一个一个保存
已修改11个文件
220 ■■■■ 文件已修改
EdgeInspector_App/EdgeInspector_App.rc 补丁 | 查看 | 原始文档 | blame | 历史
EdgeInspector_App/EdgeInspector_App.vcxproj 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
EdgeInspector_App/EdgeInspector_App.vcxproj.filters 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
EdgeInspector_App/InterfaceManager.cpp 114 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
EdgeInspector_App/InterfaceManager.h 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
EdgeInspector_App/MainFrm.cpp 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
EdgeInspector_App/Recipe/HardwareSettings.cpp 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
EdgeInspector_App/Recipe/HardwareSettings.h 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
EdgeInspector_App/View/ViewMain_HWSetting.cpp 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
EdgeInspector_App/View/ViewMain_ScanImage.cpp 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
EdgeInspector_App/resource.h 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
EdgeInspector_App/EdgeInspector_App.rc
Binary files differ
EdgeInspector_App/EdgeInspector_App.vcxproj
@@ -323,6 +323,7 @@
    <ClInclude Include="Thread\PriorityThread.h" />
    <ClInclude Include="Thread\Thread_CheckSeq.h" />
    <ClInclude Include="Thread\Thread_ControlIF.h" />
    <ClInclude Include="Thread\Thread_SaveFullImg.h" />
    <ClInclude Include="Thread\Thread_Send.h" />
    <ClInclude Include="Thread\Thread_ViewRefresh.h" />
    <ClInclude Include="TriggerBoard\TriggerControl_Mvsol.h" />
@@ -407,6 +408,7 @@
    <ClCompile Include="Thread\PriorityThread.cpp" />
    <ClCompile Include="Thread\Thread_CheckSeq.cpp" />
    <ClCompile Include="Thread\Thread_ControlIF.cpp" />
    <ClCompile Include="Thread\Thread_SaveFullImg.cpp" />
    <ClCompile Include="Thread\Thread_Send.cpp" />
    <ClCompile Include="Thread\Thread_ViewRefresh.cpp" />
    <ClCompile Include="TriggerBoard\TriggerControl_Mvsol.cpp" />
EdgeInspector_App/EdgeInspector_App.vcxproj.filters
@@ -579,6 +579,9 @@
    <ClInclude Include="WebSocket\WebSocketClientPool.h">
      <Filter>WebSocket</Filter>
    </ClInclude>
    <ClInclude Include="Thread\Thread_SaveFullImg.h">
      <Filter>Thread</Filter>
    </ClInclude>
  </ItemGroup>
  <ItemGroup>
    <ClCompile Include="stdafx.cpp">
@@ -803,6 +806,9 @@
    <ClCompile Include="WebSocket\WebSocketClientPool.cpp">
      <Filter>WebSocket</Filter>
    </ClCompile>
    <ClCompile Include="Thread\Thread_SaveFullImg.cpp">
      <Filter>Thread</Filter>
    </ClCompile>
  </ItemGroup>
  <ItemGroup>
    <ResourceCompile Include="EdgeInspector_App.rc">
EdgeInspector_App/InterfaceManager.cpp
@@ -46,6 +46,7 @@
    m_pThread_SendMSG            = NULL;
    m_pThread_CheckSequence        = NULL;
    m_pThread_ViewRefresh        = NULL;
    m_pSaveFullImgThread        = NULL;
    m_nScanStartCount            = 0;
    m_bGlassLoadingEnd            = FALSE;
    m_pLicense                    = NULL;
@@ -117,26 +118,29 @@
BOOL CInterfaceManager::DestroyThread()
{
    if(m_pThread_SendMSG != NULL)
    {
    if(m_pThread_SendMSG != nullptr) {
        m_pThread_SendMSG->StopThread();
        delete m_pThread_SendMSG;    
    }
    m_pThread_SendMSG = NULL;
    m_pThread_SendMSG = nullptr;
    if(m_pThread_CheckSequence != NULL)
    {
    if(m_pThread_CheckSequence != nullptr) {
        m_pThread_CheckSequence->StopThread();
        delete m_pThread_CheckSequence;
    }
    m_pThread_CheckSequence = NULL;
    m_pThread_CheckSequence = nullptr;
    if(m_pThread_ViewRefresh != NULL)
    {
    if(m_pThread_ViewRefresh != nullptr) {
        m_pThread_ViewRefresh->StopThread();
        delete m_pThread_ViewRefresh;
    }
    m_pThread_ViewRefresh = NULL;
    m_pThread_ViewRefresh = nullptr;
    if (m_pSaveFullImgThread != nullptr) {
        m_pSaveFullImgThread->StopThread();
        delete m_pSaveFullImgThread;
    }
    m_pSaveFullImgThread = nullptr;
    return TRUE;
}
@@ -488,13 +492,13 @@
BOOL CInterfaceManager::PostProcess()
{
    g_pLog->DisplayMessage(_T("Start PostProcess()"));
    g_pLog->DisplayMessage(_T("Start PostProcess"));
    if(m_pThread_CheckSequence != NULL)
    if (m_pThread_CheckSequence != NULL) {
        m_pThread_CheckSequence->ClearMessage();
    }
    if(m_GlassData.IsPostProcStart() == TRUE)
    {
    if(m_GlassData.IsPostProcStart() == TRUE) {
        g_pLog->DisplayMessage(_T("Already Post Processing Start"));
        return TRUE;
    }
@@ -505,7 +509,6 @@
    m_PostProcess.SetView((void*) m_pView);
    m_PostProcess.RunPostProcessing();
    // 馆靛矫 Scan End 脚龋 焊郴扁 傈俊 秦拎具茄促... Scan End 脚龋 焊尘锭 Loading捞 肯丰 救登搁 救焊郴瘤霸 阜囚乐澜..
    m_bGlassLoadingEnd = FALSE;
    m_bPLCGlassLoading = FALSE;
@@ -522,34 +525,22 @@
    SetSlashText(GLOBAL_DEFINE::emHide, _T(""), RGB(0, 0, 0));
    
    if (m_pView != NULL)
    {
    if (m_pView != NULL) {
        m_pView->SetGlassData(&m_GlassData);
        m_pView->RefreshDefect(m_PostProcess.GetResultPath(EM_RESULT_DEFECT));
        if (m_pThread_ViewRefresh != NULL)
        {
        if (m_pThread_ViewRefresh != NULL) {
            m_pThread_ViewRefresh->AddViewMSG(0, 0, VIEW_REFRESH_INSPECT_END, 0);
        }
    }
    //CheckExpireDay();    // Check License Defect..
    WritePLCResult();
    // Loading Ack
    // m_pControlInterface->SendControlBit(emSnd_Short_ScanEnd_Ack, TRUE);
    if (m_pThread_SendMSG != NULL)
    if (m_pThread_SendMSG != NULL) {
        m_pThread_SendMSG->AddSendMSG(SEND_MESSAGE_CONTROLSIGNAL, IToC_Ack_ShortScanEndSuccess, TRUE);
    }
    if (0 == nDefectCount)
    {
        AfxBeginThread(CopyImageThreadFunc, this);
    }
    else
    {
        Save_FullImg();
    }
#if MINI_LED
    m_PostProcess.RunPostProcessing_SaveFiltImage();
@@ -615,9 +606,43 @@
            g_pLog->DisplayMessage(_T("Sava %s iCam=%d, iScan=%d, szImage.cx=%ld, pBuffer->szImage.cy=%ld"), PANEL_SIDE[pCamera->m_eDimension], iCam, iScan, pBuffer->szImage.cx, pBuffer->szImage.cy);
            if (pBuffer->pImage != NULL && pBuffer->szImage.cx > 100 && pBuffer->szImage.cy > 100) {
            if (m_pSaveFullImgThread != nullptr && pBuffer->pImage != nullptr && pBuffer->szImage.cx > 100 && pBuffer->szImage.cy > 100) {
                strFileJpg.Format(_T("%s\\%s_%s_%s.jpg"), strFolder, strPanelID, PANEL_SIDE[pCamera->m_eDimension], g_pBase->m_strLoadingTime);
                if (pHard->m_bAsyncFullSave) {
                    CT2A aPath(strFileJpg);
                    SaveImgJob job;
                    job.strPath = std::string(aPath);
                    job.nWidth = (int)pBuffer->szImage.cx;
                    job.nHeight = (int)pBuffer->szImage.cy;
                    job.nBpp = 1;
                    job.nStride = job.nWidth * job.nBpp;
                    job.nStartY = 0;
                    job.nDimension = (int)pCamera->m_eDimension;
                    job.nQuality = nQuality;
                    // 深拷贝
                    DWORD dwCopyStart = GetTickCount();
                    Lock();
                    size_t nBytes = size_t(job.nStride) * job.nHeight;
                    job.vData.resize(nBytes);
                    memcpy(job.vData.data(), pBuffer->pImage, nBytes);
                    Unlock();
                    DWORD dwCopyEnd = GetTickCount();
                    g_pLog->DisplayMessage(_T("Full Image Copy Time = %d ms, Bytes=%zu, File=%s"), dwCopyEnd - dwCopyStart, nBytes, strFileJpg);
                    // 入队
                    m_pSaveFullImgThread->Enqueue(std::move(job));
                    g_pLog->DisplayMessage(_T("Full Image Save : %s, Width=%d, Height=%d, Dimension=%s, Quality=%d"), strFileJpg, pBuffer->szImage.cx, pBuffer->szImage.cy, PANEL_SIDE[pCamera->m_eDimension], nQuality);
                }
                else {
                    DWORD dwCopyStart = GetTickCount();
                    Lock();
                SaveFullImageModern(strFileJpg, pBuffer->pImage, pBuffer->szImage.cx, pBuffer->szImage.cy, (int)pCamera->m_eDimension, 0, nQuality);
                    Unlock();
                    DWORD dwCopyEnd = GetTickCount();
                    g_pLog->DisplayMessage(_T("Full Image Save Time = %d ms, File=%s"), dwCopyEnd - dwCopyStart, strFileJpg);
                }
            }
        }
    }
@@ -1784,42 +1809,27 @@
void CInterfaceManager::CreateThread()
{
    m_pThread_SendMSG = new CThread_SendMSG();
    if(m_pThread_SendMSG != NULL)
    {
    if(m_pThread_SendMSG != NULL) {
        m_pThread_SendMSG->SetIN2P(static_cast<IPLCSendInterface2Parent*>(this));
        m_pThread_SendMSG->CreateThread();
    }
    m_pThread_CheckSequence = new CThread_CheckSequence();
    if(m_pThread_CheckSequence != NULL)
    {
    if(m_pThread_CheckSequence != NULL) {
        m_pThread_CheckSequence->SetC2M(static_cast<ICheckSequenceInterface2Parent*>(this),&m_GlassData);
        m_pThread_CheckSequence->CreateThread();
    }
    m_pThread_ViewRefresh = new CThread_ViewRefresh();
    if(m_pThread_ViewRefresh != NULL)
    {
    if(m_pThread_ViewRefresh != NULL) {
        m_pThread_ViewRefresh->SetIN2P(static_cast<IViewRefreshInterface2Parent*>(this));
        m_pThread_ViewRefresh->CreateThread();
    }
    /*
    m_pThread_NetMSG = new CThread_NetMSG();
    if(m_pThread_NetMSG != NULL)
    {
        m_pThread_NetMSG->SetIN2P(static_cast<IPLCReceiveInterface2Parent*>(this));
        m_pThread_NetMSG->CreateThread();
    m_pSaveFullImgThread = new CThread_SaveFullImg();
    if (m_pSaveFullImgThread != NULL) {
        m_pSaveFullImgThread->CreateThread();
    }
    m_pThread_Light = new CThread_Light();
    if(m_pThread_Light != NULL)
    {
        m_pThread_Light->CreateThread();
    }
    */
}
LPBYTE CInterfaceManager::GetGrabBuffer(DimensionDir eDir,int iVline)
EdgeInspector_App/InterfaceManager.h
@@ -18,6 +18,7 @@
#include "LanguageControl.h"
#include "LicenseChecker.h"
#include "TriggerControl_Mvsol.h"
#include "Thread_SaveFullImg.h"
#if USE_WEBSOCKET
#include "WebSocketClientPool.h"
@@ -161,6 +162,7 @@
    CThread_SendMSG*            m_pThread_SendMSG;    
    CThread_CheckSequence*        m_pThread_CheckSequence;
    CThread_ViewRefresh*        m_pThread_ViewRefresh;
    CThread_SaveFullImg*        m_pSaveFullImgThread;
    CPostProcess                m_PostProcess;
    CCriticalSection            m_csScanStart;
    int                            m_nScanStartCount;
EdgeInspector_App/MainFrm.cpp
@@ -433,97 +433,41 @@
            std::vector<DimensionDir> vecDirs = {
                DIMENSION_A_RIP, DIMENSION_B_RIP, DIMENSION_C_RIP, DIMENSION_D_RIP
            };
            pMain->Simulate2PhaseScanByDirs(vecDirs, 1000);
            pMain->Simulate2PhaseScanByDirs(vecDirs, 3000);
        }
        break;
    case PROC_MODE_SIMULATION_SIDESHORT:
        {            
            //pMain->m_GlassData.SetScanStartCount(MAX_CAMERA_COUNT);
            //pMain->SendGlassRecipe();
            //for(iCam=0;iCam<MAX_CAMERA_COUNT;iCam++)
            //{
            //    pMain->ScanStartGrabManual(iCam,0);
            //    pMain->ScanStartManual(iCam,0);
            //}
            std::vector<DimensionDir> vecDirs = {
                DIMENSION_B, DIMENSION_D, DIMENSION_B_DN, DIMENSION_D_DN
            };
            pMain->Simulate2PhaseScanByDirs(vecDirs, 1000);
            pMain->Simulate2PhaseScanByDirs(vecDirs, 3000);
        }
        break;
    case PROC_MODE_SIMULATION_SIDELONG:
        {                
            //pMain->m_GlassData.SetScanStartCount(MAX_CAMERA_COUNT);
            //pMain->SendGlassRecipe();
            //for(iCam=0;iCam<MAX_CAMERA_COUNT;iCam++)
            //{
            //    pMain->ScanStartGrabManual(iCam,1);
            //    pMain->ScanStartManual(iCam,1);
            //}
            std::vector<DimensionDir> vecDirs = {
                DIMENSION_A, DIMENSION_C, DIMENSION_A_DN, DIMENSION_C_DN
            };
            pMain->Simulate2PhaseScanByDirs(vecDirs, 1000);
            pMain->Simulate2PhaseScanByDirs(vecDirs, 3000);
        }
        break;
    case PROC_MODE_SIMULATION_ALL:
        {
            //g_pLog->DisplayMessage(_T("Simulation Full "));
            //pMain->m_GlassData.SetScanStartCount(MAX_DIMENSION_COUNT);
            //pMain->SendGlassRecipe();
            //for(iCam=0;iCam<MAX_CAMERA_COUNT;iCam++)
            //{
            //    pMain->ScanStartGrabManual(iCam,0);
            //    pMain->ScanStartGrabManual(iCam,1);
            //}
            //if(pMain->m_pThread_CheckSequence != NULL)
            //{
            //    double dOneScanTime = pMain->m_GlassRecipe.m_RecieParm.m_dOneScanTime_sec;
            //
            //    pMain->m_pThread_CheckSequence->AddCheckSeqMSG(CHECKSEQ_GLASS_INSPECTION_OVERTIME,(int)(dOneScanTime* 1000.),pMain->m_HardwareRecipe.GetScanCount()-1);
            //    g_pLog->DisplayMessage(_T("Simulation Time Out Set : %.1f"),dOneScanTime);
            //}
            //for(iCam=0;iCam<MAX_CAMERA_COUNT;iCam++)
            //{
            //    pMain->ScanStartManual(iCam,0);
            //}
            //DWORD sTime = GetTickCount();
            //while(TRUE)
            //{
            //    if(pMain->m_GlassData.GetScanEnd(0) == TRUE)
            //        break;
            //    if(GetTickCount() - sTime >= 5000)
            //        break;
            //
            //    Sleep(10);
            //}
            //for(iCam=0;iCam<MAX_CAMERA_COUNT;iCam++)
            //{
            //    pMain->ScanStartManual(iCam,1);
            //}
            if (pMain->m_HardwareRecipe.m_bUseRipInspection) {
                std::vector<DimensionDir> vecDirs = {
                    DIMENSION_A, DIMENSION_C, DIMENSION_A_DN, DIMENSION_C_DN,
                    DIMENSION_B, DIMENSION_D, DIMENSION_B_DN, DIMENSION_D_DN,
                    DIMENSION_A_RIP, DIMENSION_B_RIP, DIMENSION_C_RIP, DIMENSION_D_RIP
                };
                pMain->Simulate2PhaseScanByDirs(vecDirs, 1000);
                pMain->Simulate2PhaseScanByDirs(vecDirs, 3000);
            }
            else {
                std::vector<DimensionDir> vecDirs = {
                    DIMENSION_A, DIMENSION_C, DIMENSION_A_DN, DIMENSION_C_DN,
                    DIMENSION_B, DIMENSION_D, DIMENSION_B_DN, DIMENSION_D_DN
                };
                pMain->Simulate2PhaseScanByDirs(vecDirs, 1000);
                pMain->Simulate2PhaseScanByDirs(vecDirs, 3000);
            }
        }
        break;
EdgeInspector_App/Recipe/HardwareSettings.cpp
@@ -1010,7 +1010,9 @@
        m_strMachineName = rhs.m_strMachineName;
        m_strLineID = rhs.m_strLineID;
        m_nPLCSignalRetry = rhs.m_nPLCSignalRetry;        
        m_nSaveImageQuality = rhs.m_nSaveImageQuality;
        m_bAsyncFullSave = rhs.m_bAsyncFullSave;
        //        m_dOneScanTime = rhs.m_dOneScanTime;
        m_nFolderRemoveDay = rhs.m_nFolderRemoveDay;
@@ -1058,6 +1060,7 @@
    m_nFolderRemoveDay = 0;
    m_nPLCSignalRetry = 0;
    m_nSaveImageQuality = 30;
    m_bAsyncFullSave = FALSE;
    m_strMachineName = _T("");
    m_strLineID = _T("");
    m_nBoardType = GRAB_LINK_BOARD;
@@ -1280,6 +1283,8 @@
        str = _T("SAVE_DEBUG_IMAGE");
    else if((void *)&m_nSaveImageQuality == pValue)
        str = _T("SAVEIMAGE_QUALITY");
    else if ((void*)&m_bAsyncFullSave == pValue)
        str = _T("ASYNC_FULL_SAVE");
    // ly,2025.07.10
    else if ((void*)&m_bSaveResultByHour == pValue)
@@ -1381,6 +1386,10 @@
        return FALSE;
    BasicInfoFile.GetItemValue((TCHAR*)(LPCTSTR)str,m_nSaveImageQuality,30);    
    
    str = GetFileString((void*)&m_bAsyncFullSave);
    if (str.IsEmpty() == TRUE)
        return FALSE;
    BasicInfoFile.GetItemValue((TCHAR*)(LPCTSTR)str, m_bAsyncFullSave, FALSE);
    SetCameraCount(m_nCameraCount,m_nScanCount);
    iLoop = 0;
@@ -1569,6 +1578,11 @@
        return FALSE;
    Register.GetItemValue((TCHAR*)(LPCTSTR)str,m_nSaveImageQuality,30);    
    str = GetFileString((void*)&m_bAsyncFullSave);
    if (str.IsEmpty() == TRUE)
        return FALSE;
    Register.GetItemValue((TCHAR*)(LPCTSTR)str, m_bAsyncFullSave, FALSE);
    SetCameraCount(m_nCameraCount,m_nScanCount);
    iLoop = 0;
    for(iCam=0;iCam<m_nCameraCount;iCam++)
@@ -1737,6 +1751,11 @@
    if(str.IsEmpty() == TRUE)
        return FALSE;
    Register.SetItemValue((TCHAR*)(LPCTSTR)str,m_nSaveImageQuality);
    str = GetFileString((void*)&m_bAsyncFullSave);
    if (str.IsEmpty() == TRUE)
        return FALSE;
    Register.SetItemValue((TCHAR*)(LPCTSTR)str, m_bAsyncFullSave);
    if(m_pCameraSettings != NULL)
    {
@@ -1928,6 +1947,12 @@
    }
    BasicInfoFile.SetItemValue((TCHAR*)(LPCTSTR)str,m_nSaveImageQuality);    
    str = GetFileString((void*)&m_bAsyncFullSave);
    if (str.IsEmpty() == TRUE) {
        return FALSE;
    }
    BasicInfoFile.SetItemValue((TCHAR*)(LPCTSTR)str, m_bAsyncFullSave);
    if (m_pCameraSettings != NULL) {
        iLoop = 0;
        for (iCam = 0; iCam < m_nCameraCount; iCam++) {
EdgeInspector_App/Recipe/HardwareSettings.h
@@ -185,6 +185,7 @@
    int                            m_nFolderRemoveDay;
    BOOL                        m_bUseColorVisual;
    int                            m_nSaveImageQuality;
    BOOL                        m_bAsyncFullSave;
    // Software
public:
EdgeInspector_App/View/ViewMain_HWSetting.cpp
@@ -66,6 +66,7 @@
    DDX_Text(pDX, IDC_EDIT_PLC_SIGNAL_RETRY_COUNT, m_pDlgHDSettingParm->m_nPLCSignalRetry);        
    DDX_Text(pDX, IDC_EDIT_SAVEIMAGE_QUALITY, m_pDlgHDSettingParm->m_nSaveImageQuality);        
    DDX_Check(pDX, IDC_CHECK_USE_ASYNC_FULL_IMAGE_SAVE, m_pDlgHDSettingParm->m_bAsyncFullSave);
    
    DDX_Text(pDX,IDC_EDIT_FOLDER_REMOVE_DAY,m_pDlgHDSettingParm->m_nFolderRemoveDay);
    
EdgeInspector_App/View/ViewMain_ScanImage.cpp
@@ -949,7 +949,7 @@
BOOL CViewMain_ScanImage::ManualThreadStart(int nCmd,int nIndex /*= -1*/)
{
    if(m_pManualProcess) {
        DWORD dwWait = ::WaitForSingleObject(m_pManualProcess->m_hThread, 1000);
        DWORD dwWait = ::WaitForSingleObject(m_pManualProcess->m_hThread, 3000);
        if (dwWait == WAIT_TIMEOUT) {
            DWORD dwExitCode;
            if ((::GetExitCodeThread(m_pManualProcess->m_hThread, &dwExitCode)) && (dwExitCode == STILL_ACTIVE)) {
EdgeInspector_App/resource.h
@@ -363,6 +363,7 @@
#define IDC_CHK_USECOLORVISUAL          1072
#define IDC_STATIC_SUBJECT              1072
#define IDC_SCROLLBAR_V_9               1072
#define IDC_CHECK_USE_ASYNC_FULL_IMAGE_SAVE 1073
#define IDC_UPDN_WIDTH1                 1074
#define IDC_BTN_PROC                    1075
#define IDC_SLIDER_ZOOM                 1076