From fa4a9b9390cc81b454316256144de946d0bb25ca Mon Sep 17 00:00:00 2001
From: mrDarker <mr.darker@163.com>
Date: 星期五, 11 七月 2025 17:38:39 +0800
Subject: [PATCH] 添加批处理功能(文件夹选择、开始、停止) - 新增批处理按钮“Start Batch”“Stop Batch” - 支持弹窗选择文件夹进行批量处理 - 支持批处理中断(停止) - 使用消息驱动处理批量调度,界面不卡顿 - 调整批处理流程,所有面处理结束后自动进入下一个文件夹

---
 ENRIT/resource.h                |    0 
 ENRIT/Process/InspectCamera.cpp |    2 -
 ENRIT/View/ViewScanImage.cpp    |   79 ++++++++++++++++++++++++++++++++++++++-
 ENRIT/View/ViewScanImage.h      |   12 +++++
 ENRIT/ENRIT.rc                  |    0 
 ENRIT/MainFrm.cpp               |    2 
 ENRIT/Define/Global_Define.h    |   13 +++---
 7 files changed, 96 insertions(+), 12 deletions(-)

diff --git a/ENRIT/Define/Global_Define.h b/ENRIT/Define/Global_Define.h
index 0fd815b..d4ac76c 100644
--- a/ENRIT/Define/Global_Define.h
+++ b/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
diff --git a/ENRIT/ENRIT.rc b/ENRIT/ENRIT.rc
index 9517db0..0d42b1b 100644
--- a/ENRIT/ENRIT.rc
+++ b/ENRIT/ENRIT.rc
Binary files differ
diff --git a/ENRIT/MainFrm.cpp b/ENRIT/MainFrm.cpp
index d7a1197..1b55d86 100644
--- a/ENRIT/MainFrm.cpp
+++ b/ENRIT/MainFrm.cpp
@@ -484,7 +484,7 @@
 				pMain->ScanStartManual(iCam,0);						
 			}			
 
-			DWORD		sTime = GetTickCount();
+			DWORD sTime = GetTickCount();
 			while(TRUE)
 			{
 				if(pMain->m_GlassData.GetScanEnd(0) == TRUE)
diff --git a/ENRIT/Process/InspectCamera.cpp b/ENRIT/Process/InspectCamera.cpp
index 7c2dc79..2ad36ac 100644
--- a/ENRIT/Process/InspectCamera.cpp
+++ b/ENRIT/Process/InspectCamera.cpp
@@ -4322,13 +4322,11 @@
 
 BOOL CInspectCamera::OnThreadEnd(int iThread, CInspectThread *pInspectThread)
 {
-
 	return TRUE;
 }
 
 BOOL CInspectCamera::OnThreadEndAll()
 {
-
 	return TRUE;
 }
 
diff --git a/ENRIT/View/ViewScanImage.cpp b/ENRIT/View/ViewScanImage.cpp
index 2ba97fb..e38a91b 100644
--- a/ENRIT/View/ViewScanImage.cpp
+++ b/ENRIT/View/ViewScanImage.cpp
@@ -34,7 +34,10 @@
 	m_nThreadCmd	= 0;
 	m_IV2M = NULL;
 	m_pHardware = NULL;
-	m_pGlassData = 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;
diff --git a/ENRIT/View/ViewScanImage.h b/ENRIT/View/ViewScanImage.h
index ed35659..865d1a1 100644
--- a/ENRIT/View/ViewScanImage.h
+++ b/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];
@@ -111,5 +116,10 @@
 	BOOL			m_bInitDlg;
 	CHardwareSettings		*m_pHardware;
 	IViewInterface2Parent	*m_IV2M;
-	CGlass_Data				*m_pGlassData;	
+	CGlass_Data				*m_pGlassData;
+
+	// ly,2025.07.11
+	int				m_nCurrentFolderIndex;
+	BOOL			m_bIsBatchProcessing;
+	CStringArray	m_arrFolderList;
 };
diff --git a/ENRIT/resource.h b/ENRIT/resource.h
index 6609744..96da743 100644
--- a/ENRIT/resource.h
+++ b/ENRIT/resource.h
Binary files differ

--
Gitblit v1.9.3