添加批处理功能(文件夹选择、开始、停止)
- 新增批处理按钮“Start Batch”“Stop Batch”
- 支持弹窗选择文件夹进行批量处理
- 支持批处理中断(停止)
- 使用消息驱动处理批量调度,界面不卡顿
- 调整批处理流程,所有面处理结束后自动进入下一个文件夹
已修改7个文件
102 ■■■■■ 文件已修改
ENRIT/Define/Global_Define.h 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ENRIT/ENRIT.rc 补丁 | 查看 | 原始文档 | blame | 历史
ENRIT/MainFrm.cpp 补丁 | 查看 | 原始文档 | blame | 历史
ENRIT/Process/InspectCamera.cpp 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ENRIT/View/ViewScanImage.cpp 77 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ENRIT/View/ViewScanImage.h 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ENRIT/resource.h 补丁 | 查看 | 原始文档 | blame | 历史
ENRIT/Define/Global_Define.h
@@ -6,12 +6,13 @@
#include <functional>
using namespace std;
#define WM_USER_SYSTEM_CLOSE                        WM_USER + 1
#define UM_LIST_SELECTDEFECT                        WM_USER + 2
#define WM_POCESS_STATUS                            WM_USER + 3
#define WM_LIVE_IMG_UPDATE                            WM_USER + 4
#define UM_UPDATE_RECIPE                            WM_USER + 5
#define    UM_SEND_MESSAGE_MAIN_DLG                    WM_USER + 6
#define WM_USER_SYSTEM_CLOSE                        (WM_USER + 1)
#define UM_LIST_SELECTDEFECT                        (WM_USER + 2)
#define WM_POCESS_STATUS                            (WM_USER + 3)
#define WM_LIVE_IMG_UPDATE                            (WM_USER + 4)
#define UM_UPDATE_RECIPE                            (WM_USER + 5)
#define    UM_SEND_MESSAGE_MAIN_DLG                    (WM_USER + 6)
#define WM_BATCH_PROCESS_NEXT                        (WM_USER + 7)
#define    MAX_CAMERA_COUNT            4
#define MAX_SCAN_COUNT                2
ENRIT/ENRIT.rc
Binary files differ
ENRIT/MainFrm.cpp
ENRIT/Process/InspectCamera.cpp
@@ -4322,13 +4322,11 @@
BOOL CInspectCamera::OnThreadEnd(int iThread, CInspectThread *pInspectThread)
{
    return TRUE;
}
BOOL CInspectCamera::OnThreadEndAll()
{
    return TRUE;
}
ENRIT/View/ViewScanImage.cpp
@@ -35,6 +35,9 @@
    m_IV2M = NULL;
    m_pHardware = NULL;
    m_pGlassData = NULL;    
    m_nCurrentFolderIndex = 0;
    m_bIsBatchProcessing = FALSE;
}
CViewScanImage::~CViewScanImage()
@@ -160,6 +163,8 @@
    ON_EVENT(CViewScanImage, IDC_BTN_PROC, DISPID_CLICK, CViewScanImage::OnBnClickedBtnProc, VTS_NONE)
    ON_EVENT(CViewScanImage, IDC_BTN_LOAD_ALL, DISPID_CLICK, CViewScanImage::OnBnClickedLoadAll, VTS_NONE)
    ON_EVENT(CViewScanImage, IDC_SAVE_ALL, DISPID_CLICK, CViewScanImage::OnBnClickedSaveAll, VTS_NONE)
    ON_EVENT(CViewScanImage, IDC_BTN_START_BATCH, DISPID_CLICK, CViewScanImage::OnBtnStartBatch, VTS_NONE)
    ON_EVENT(CViewScanImage, IDC_BTN_STOP_BATCH, DISPID_CLICK, CViewScanImage::OnBtnStopBatch, VTS_NONE)
END_EVENTSINK_MAP()
@@ -345,6 +350,18 @@
        m_frameImg[nIndex].ViewUpdate();
    }
    return 1;
}
LRESULT CViewScanImage::OnBatchProcessNext(WPARAM wParam, LPARAM lParam)
{
    if (!m_bIsBatchProcessing) {
        return 0;
    }
    m_nCurrentFolderIndex++;
    ProcessNextFolder();
    return 0;
}
void CViewScanImage::SetRecipe(CHardwareSettings *pHW)
@@ -636,7 +653,6 @@
    scrollInfoH.nTrackPos    = 64;
    
    double dZoom = m_frameImg[0].GetZoomData();
    scrollInfoV.nPage    = m_frameImg[0].m_WndRect.Height();
    scrollInfoH.nPage    = (int)(m_frameImg[0].m_WndRect.Width() / dZoom);    
@@ -1043,6 +1059,23 @@
void CViewScanImage::OnBnClickedLoadAll()  {ManualThreadStart(M_CMD_IMG_LOAD_ALL,-1);}
void CViewScanImage::OnBnClickedSaveAll()  {ManualThreadStart(M_CMD_IMG_SAVE_ALL,-1);}
void CViewScanImage::OnBtnStartBatch()
{
    // 启动批处理
    CFolderPickerDialog dlg(NULL, OFN_FILEMUSTEXIST | OFN_ALLOWMULTISELECT, this, 0);
    if (dlg.DoModal() == IDOK) {
        CString strFolderPath = dlg.GetPathName();
        m_bIsBatchProcessing = TRUE;
        StartBatchProcess(strFolderPath);
    }
}
void CViewScanImage::OnBtnStopBatch()
{
    // 停止批处理
    m_bIsBatchProcessing = FALSE;
}
BOOL CViewScanImage::ManualThreadStart(int nCmd,int nIndex /*= -1*/)
{
    if (m_pManualProcess) {
@@ -1306,6 +1339,7 @@
        }
        // 执行处理线程
        m_nIndex = -1;
        switch (m_nShowSelect)
        {
        case 0:
@@ -1321,6 +1355,47 @@
    }
}
void CViewScanImage::StartBatchProcess(const CString& strRootFolder)
{
    m_arrFolderList.RemoveAll();
    // 搜索所有子文件夹
    CFileFind finder;
    CString strSearchPath = strRootFolder + _T("\\*.*");
    BOOL bWorking = finder.FindFile(strSearchPath);
    while (bWorking) {
        bWorking = finder.FindNextFile();
        // 排除 . 和 .. 以及非文件夹
        if (finder.IsDots() || !finder.IsDirectory()) {
            continue;
        }
        m_arrFolderList.Add(finder.GetFilePath());
    }
    finder.Close();
    // 从第一个开始处理
    m_nCurrentFolderIndex = 0;
    ProcessNextFolder();
}
void CViewScanImage::ProcessNextFolder()
{
    if (!m_bIsBatchProcessing) {
        return;
    }
    if (m_nCurrentFolderIndex < m_arrFolderList.GetSize()) {
        CString strFolder = m_arrFolderList[m_nCurrentFolderIndex];
        LoadAndProcessImages(strFolder);
    }
    else {
        m_arrFolderList.RemoveAll();
        m_bIsBatchProcessing = FALSE;
    }
}
UINT CViewScanImage::ManualProcessAll(LPVOID pParam)
{
    CViewScanImage *pDlg = (CViewScanImage*)pParam;
ENRIT/View/ViewScanImage.h
@@ -59,6 +59,7 @@
    afx_msg void OnBnClickedCheckAutoView();
    afx_msg void OnTimer(UINT_PTR nIDEvent);
    LRESULT OnProcessStatus(WPARAM wParam, LPARAM lParam);
    LRESULT OnBatchProcessNext(WPARAM wParam, LPARAM lParam);
    DECLARE_MESSAGE_MAP()
    DECLARE_EVENTSINK_MAP()
@@ -77,6 +78,8 @@
    void            OnBnClickedBtnProc();
    void            OnBnClickedLoadAll();
    void            OnBnClickedSaveAll();
    void            OnBtnStartBatch();
    void            OnBtnStopBatch();
protected:
    int                GetSideIdx(int nViewIndex);
@@ -91,6 +94,8 @@
    void            SaveFullImage(int nViewIndex);
    void            SaveFullImageAll();    
    void            LoadAndProcessImages(const CString& strFolderPath);
    void            StartBatchProcess(const CString& strRootFolder);
    void            ProcessNextFolder();
protected:
    CMFCButton        m_btnLoad[MAX_PANEL_SIDE * UPDN_TYPE];
@@ -112,4 +117,9 @@
    CHardwareSettings        *m_pHardware;
    IViewInterface2Parent    *m_IV2M;
    CGlass_Data                *m_pGlassData;    
    // ly,2025.07.11
    int                m_nCurrentFolderIndex;
    BOOL            m_bIsBatchProcessing;
    CStringArray    m_arrFolderList;
};
ENRIT/resource.h
Binary files differ