From 4114d380bd594385fa6f10bb36a9eef4d19e8db1 Mon Sep 17 00:00:00 2001
From: kojingeun <diteam.co.kr>
Date: 월, 05 6월 2023 23:33:58 +0900
Subject: [PATCH] Ongoing50 #4517 CF AOI Review 결과 파일 찾기 실패 개선 1. Find Bin File 찾는 Library 변경  - CRT _findfirsti64 / _findnexti64 -> C++17 Filesystem directory_iterator  - 파일 탐색 시간 20k Files(80GB) 1sec 소요

---
 DitGlassRawMessenger/DitGlassRawMessenger/RawResultReader.cpp |  231 ++++++++++++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 216 insertions(+), 15 deletions(-)

diff --git a/DitGlassRawMessenger/DitGlassRawMessenger/RawResultReader.cpp b/DitGlassRawMessenger/DitGlassRawMessenger/RawResultReader.cpp
index ea5f9c5..290b0fd 100644
--- a/DitGlassRawMessenger/DitGlassRawMessenger/RawResultReader.cpp
+++ b/DitGlassRawMessenger/DitGlassRawMessenger/RawResultReader.cpp
@@ -5,6 +5,7 @@
 #include <process.h>
 #include "DitGlassRawClient.h"
 #include "GlassRawBase.h"
+#include <sstream>
 
 #ifdef _DEBUG
 #undef THIS_FILE
@@ -47,18 +48,33 @@
 BOOL CRawResultReader::openFile(char* pGlassID)
 {
 	CString strFileName;
-	CDitGlassRawClient	GlassRawClient;
-	GlassRawClient.ConnectServer();
-	CDitGlassRawClient* pShared = &GlassRawClient;
+	
+	/*< KJG 20211208 : #3696 DEL Start >*/
+	//CDitGlassRawClient	GlassRawClient;
+	//GlassRawClient.ConnectServer();
+	//CDitGlassRawClient* pShared = &GlassRawClient;
 
-	_grmDefectData* pGrmStack;
+	//_grmDefectData* pGrmStack;
+	/*< KJG 20211208 : #3696 DEL End >*/
 
 	strFileName.Format("%s\\%s", m_strLocalPath, pGlassID);
+
 
 	FILE* pf = fopen(strFileName.GetBuffer(0), "r");
 
 	if (pf == NULL)
 		return FALSE;
+		
+	/* <KMH 20220407 : #4053 ADD Start> */
+	AKLOG("Function : Read File Path: %s" , strFileName);
+	/* <KMH 20220407 : #4053 ADD End> */
+	/*< KJG 20211208 : #3696 ADD Start >*/
+	CDitGlassRawClient	GlassRawClient;
+	GlassRawClient.ConnectServer();
+	CDitGlassRawClient* pShared = &GlassRawClient;
+
+	_grmDefectData* pGrmStack;
+	/*< KJG 20211208 : #3696 ADD End >*/
 
 	std::vector<_grmDefectData> vecStackDefect;
 	_grmDefectData StackDefect;
@@ -77,6 +93,21 @@
 		if (strlen(buffer) <= 0 || pStr == NULL)
 			break;
 
+		/* < KJG 20220225 - #3850 ADD Start >*/ 
+		if (strncmp(buffer, "DATA PANEL", 10) == 0)
+		{
+			pReadPoint = buffer;
+			CString strtemp;
+			pReadPoint = getParsingData(pReadPoint, 4, &strtemp);
+			pReadPoint = getParsingData(pReadPoint, 5, &strtemp);
+			pReadPoint = getParsingData(pReadPoint, 5, &strtemp);
+			pReadPoint = getParsingData(pReadPoint, 27, &strtemp);
+			pReadPoint = getParsingData(pReadPoint, 20, &strtemp);
+			pReadPoint = getParsingData(pReadPoint, 20, &strtemp);
+			pReadPoint = getParsingData(pReadPoint, 10, &strtemp);
+			strncpy(pShared->GetGlassData()->m_strRawMergeStepID, strtemp.GetBuffer(0), 10 + 1); // Null 문자 떄문에 +1
+		}
+		/* < KJG 20220225 - #3850 ADD End >*/
 		if (strncmp(buffer, "DATA DEFECT", 10)) continue; 
 
 		//Defect Stack Start
@@ -125,6 +156,12 @@
 				StackDefect.m_DefectJudgement = Judge_TR;
 			else if (strtemp == "PR")
 				StackDefect.m_DefectJudgement = Judge_PR;
+			/* < KJG 20220225 - #Index ADD Start >*/ 			
+			else if (strtemp == "NG")
+				StackDefect.m_DefectJudgement = Judge_NG;
+			else if (strtemp == "ND")
+				StackDefect.m_DefectJudgement = Judge_ND;
+			/* < KJG 20220225 - #Index ADD End >*/
 			else
 				StackDefect.m_StackInfo = Stack_Unknown;
 
@@ -145,12 +182,31 @@
 				StackDefect.m_StackInfo = Stack_Unknown;
 
 			pReadPoint = getParsingData(pReadPoint, 2, &StackDefect.m_nStackStepCount);
-			pReadPoint = getParsingData(pReadPoint, 60, &strtemp); // Stack Step m_strStackFirst	
-			strncpy(StackDefect.m_strStackFirst, strtemp.GetBuffer(0), 60);
+		/* < KMH 20220712 : #4230 MOD Start > */
+			//pReadPoint = getParsingData(pReadPoint, 60, &strtemp); // Stack Step m_strStackFirst	
+			//strncpy(StackDefect.m_strStackFirst, strtemp.GetBuffer(0), 60);
+			pReadPoint = getParsingData(pReadPoint, 400, &strtemp); // Stack Step m_strStackFirst
+			strncpy(StackDefect.m_strStackFirst, strtemp.GetBuffer(0), 400);
+		/* < KMH 20220712 : #4230 MOD End > */
 			pReadPoint = getParsingData(pReadPoint, 16, &strtemp); // ReviewImageName m_strRevImageName
 			pReadPoint = getParsingData(pReadPoint, 12, &temp); // 미사용
 			pReadPoint = getParsingData(pReadPoint, 12, &temp); // 미사용
 			pReadPoint = getParsingData(pReadPoint, 12, &strtemp); // ZoneNum m_sZonePixelCount[i]
+			
+			stringstream ConvertZone(strtemp.GetBuffer(0));
+			unsigned int nZoneHexValue;
+			short sZonePixelCount[16] = { 0 };
+			ConvertZone >> std::hex >> nZoneHexValue;
+			for (int i = 0; i < 16; i++)
+			{
+				if (nZoneHexValue & 1)
+				{
+					sZonePixelCount[i] = 1;
+				}
+				nZoneHexValue = nZoneHexValue >> 1;
+			}
+			memcpy_s(StackDefect.m_sZonePixelCount, sizeof(StackDefect.m_sZonePixelCount), sZonePixelCount, sizeof(sZonePixelCount));
+
 			pReadPoint = getParsingData(pReadPoint, 12, &strtemp);//m_DefectSizeType
 			if (strtemp == "S")
 				StackDefect.m_DefectSizeType = SizeType_Small;
@@ -230,6 +286,24 @@
 			else
 				StackDefect.m_DefectType = DefectType_Unknown;
 	
+
+			pReadPoint = getParsingData(pReadPoint, 12, &strtemp); // Shrink
+			pReadPoint = getParsingData(pReadPoint, 12, &strtemp); // ZoneClassNum m_sZoneClassPixelCount[i]
+			stringstream ConvertClass(strtemp.GetBuffer(0));
+			unsigned int nClassHexValue;
+			short sZoneClassPixelCount[16] = { 0 };
+			ConvertClass >> std::hex >> nClassHexValue;
+			for (int i = 0; i < 16; i++)
+			{
+				if (nClassHexValue & 1)
+				{
+					sZoneClassPixelCount[i] = 1;
+				}
+				nClassHexValue = nClassHexValue >> 1;
+			}
+			memcpy_s(StackDefect.m_sZoneClassPixelCount, sizeof(StackDefect.m_sZoneClassPixelCount), sZoneClassPixelCount, sizeof(sZoneClassPixelCount));
+
+
 			vecStackDefect.push_back(StackDefect);
 		}
 	}
@@ -250,7 +324,10 @@
 	pShared->GetGlassData()->m_nRawMergeNum = m_vecStackDefect.size(); // RawMerge
 	pShared->GetGlassData()->m_bRawMergeRead = TRUE;
 
-	AKLOG("Import Vector Size : %d", m_vecStackDefect.size());
+	/* < KJG 20220225 - #3850 MOD Start >*/ 
+	//AKLOG("Import Vector Size : %d", m_vecStackDefect.size());
+	AKLOG("Import Vector Size : [%s]%d", pShared->GetGlassData()->m_strRawMergeStepID, m_vecStackDefect.size());
+	/* < KJG 20220225 - #3850 MOD End >*/
 	return TRUE;
 }
 
@@ -289,7 +366,7 @@
 	return &pBuf[nLen + 1]; //구분자 건너 뛰어서 다음 읽을 포인트 넘겨준다
 }
 
-BOOL CRawResultReader::readOptionFile(char* pFileName /*= "C:\\AOIServer\\ConfigFile\\MacroInfo.cfg"*/)
+BOOL CRawResultReader::readOptionFile(char* pFileName /*= "D:\\AOIServer\\ConfigFile\\MacroInfo.cfg"*/)
 {
 	if (pFileName == NULL) pFileName = m_strConfigFile;
 
@@ -299,7 +376,9 @@
 	akFileDB.getItem("RawMerge_Use", &m_bStackUse, 0);
 	akFileDB.getItem("RawMerge_LocalPath", m_strLocalPath, "D:\\DIT_ResultData\\RawMerge");
 
-	if (m_bStackUse && m_nThreadStackFileReadFlag == 0)
+	//< SWK 20220413 - #4053 MOD >
+//	if (/*m_bStackUse && */m_nThreadStackFileReadFlag == 0)
+	if (m_nThreadStackFileReadFlag == 0)
 	{
 		_beginthread(threadResultFileRead, NULL, this);
 	}
@@ -326,7 +405,8 @@
 			nReadFailCount = 0;
 
 			AKLOG("RawMerge File Read Start : %s\\%s", pThis->m_strLocalPath, strGlassID);
-			Sleep(3000);
+			//< SWK 20220413 - #4053 DEL >
+//			Sleep(3000);
 			while (pThis->m_nProcessState == RPS_StateFileRead && pThis->m_nThreadStackFileReadFlag == 1)
 			{
 				if ((nThreadCount++ % 20) != 0) //명령 수행을 빠르게 감지 위한 조치
@@ -342,15 +422,19 @@
 				}
 
 				nReadFailCount++;
-				AKLOG("RawMerge File Read Try : %d", nReadFailCount);
+				//< SWK 20220413 - #4053 DEL >
+//				AKLOG("RawMerge File Read Try : %d", nReadFailCount);
 
 				if (nReadFailCount > 10)
 				{
 					pThis->m_nProcessState = RPS_ResultReadFail;
 					break;
 				}
+				//< SWK 20220413 - #4053 ADD >
+				AKLOG("RawMerge File Read Try : %d", nReadFailCount);
 
-				Sleep(50);
+				//< SWK 20220413 - #4053 DEL >
+//				Sleep(50);
 			}
 			if (pThis->m_nProcessState != RPS_ResultReadOK)
 			{
@@ -363,9 +447,91 @@
 
 	pThis->m_nThreadStackFileReadFlag = 0;
 }
-
+/* <LJC 20211122 : #3820 ADD Start> */
+/*< SWK 20220413 - #4053 MOD Start >*/
+//void CRawResultReader::ProcessResultFileRead(void * pArg)
+void CRawResultReader::ProcessResultFileRead()
+/*< SWK 20220413 - #4053 MOD End >*/
+{
+	/*< SWK 20220413 - #4053 MOD Start >*/
+//	CRawResultReader* pThis = (CRawResultReader*)pArg;
+//
+//	pThis->m_nThreadStackFileReadFlag = 1;
+// 	int nReadFailCount = 0;
+// 	int nThreadCount = 0;
+//	CString strGlassID;
+//
+// 	while (pThis->m_nThreadStackFileReadFlag == 1)
+// 	{
+//		if (pThis->m_nProcessState == RPS_CmdFileRead) //스택파일 읽기 수행 [김태현 2019/1/12]
+//		{
+//			strGlassID = pThis->m_strGlassID;
+//
+//			pThis->m_nProcessState = RPS_StateFileRead;
+// 			nThreadCount = 0;
+// 			nReadFailCount = 0;
+//			AKLOG("RawMerge File Read Start : %s\\%s", pThis->m_strLocalPath, strGlassID);
+//			Sleep(3000);
+// 			while (pThis->m_nProcessState == RPS_StateFileRead && pThis->m_nThreadStackFileReadFlag == 1)
+// 			{
+// 				if (pThis->openFile(strGlassID.GetBuffer(0)) == TRUE)
+// 				{
+// 					pThis->m_nProcessState = RPS_ResultReadOK;
+// 					AKLOG("RawMerge File Read Complete ");
+// 					break;
+// 				}
+// 				nReadFailCount++;
+//				AKLOG("RawMerge File Read Try : %d", nReadFailCount);
+// 				if (nReadFailCount > 10)
+// 				{
+// 					pThis->m_nProcessState = RPS_ResultReadFail;
+// 					break;
+// 				}
+//				Sleep(50);
+// 			}
+// 			if (pThis->m_nProcessState != RPS_ResultReadOK)
+// 			{
+// 				pThis->m_nProcessState = RPS_ResultReadFail;
+// 			}
+//		}
+// 		if (nReadFailCount)
+// 			Sleep(500);
+// 	}
+// 	pThis->m_nThreadStackFileReadFlag = 0;
+	m_nProcessState = RPS_StateFileRead;
+	int nReadFailCount = 0;
+	int nThreadCount = 0;
+	AKLOG("RawMerge File Read Start : %s\\%s", m_strLocalPath, m_strGlassID);
+	while (m_nProcessState == RPS_StateFileRead && m_nThreadStackFileReadFlag == 1)
+	{
+		if (openFile(m_strGlassID.GetBuffer(0)) == TRUE)
+		{
+			m_nProcessState = RPS_ResultReadOK;
+			AKLOG("RawMerge File Read Complete ");
+			break;
+		}
+		nReadFailCount++;
+		if (nReadFailCount > 10)
+		{
+			m_nProcessState = RPS_ResultReadFail;
+			break;
+		}
+		AKLOG("RawMerge File Read Try : %d", nReadFailCount);
+	}
+	if (m_nProcessState != RPS_ResultReadOK)
+	{
+		m_nProcessState = RPS_ResultReadFail;
+	}
+	/*< SWK 20220413 - #4053 MOD End >*/
+}
+/* <LJC 20211122 : #3820 ADD End> */
 BOOL CRawResultReader::RawMergeFileReadStart(char* pGlassID)
 {
+	/*< SWK 20220413 - #4053 ADD Start >*/
+	m_strGlassID = pGlassID;
+	m_nProcessState = RPS_CmdFileRead;
+	/*< SWK 20220413 - #4053 ADD End >*/
+
 	if (m_nThreadStackFileReadFlag == 0)
 	{
 		_beginthread(threadResultFileRead, NULL, this);
@@ -377,12 +543,47 @@
 		while (m_nProcessState == RPS_CmdFileStop) Sleep(0);
 	}
 
-	m_strGlassID = pGlassID;
-	m_nProcessState = RPS_CmdFileRead;
+	/*< SWK 20220413 - #4053 DEL Start >
+// 	m_strGlassID = pGlassID;
+// 	m_nProcessState = RPS_CmdFileRead;
+	< SWK 20220413 - #4053 DEL End >*/
 	
 	return TRUE;
 }
+/* <LJC 20211122 : #3820 ADD Start> */
+BOOL CRawResultReader::ProcessRawMergeFileReadStart(char * pGlassID)
+{
+	if (m_nThreadStackFileReadFlag == 0)
+	{
+		//< SWK 20220413 - #4053 MOD >
+//		ProcessResultFileRead(this);
+		ProcessResultFileRead();
+	}
+	/*< SWK 20220413 - #4053 MOD Start >*/
+// 	if (m_nProcessState == RPS_StateFileRead)
+// 	{
+// 		m_nProcessState = RPS_CmdFileStop;
+// 		while (m_nProcessState == RPS_CmdFileStop) Sleep(0);
+// 	}
+// 
+// 	m_strGlassID = pGlassID;
+// 	m_nProcessState = RPS_CmdFileRead;
+	else
+	{
+		if (m_nProcessState == RPS_StateFileRead)
+		{
+			m_nProcessState = RPS_CmdFileStop;
+			while (!(m_nProcessState == RPS_ResultReadOK || m_nProcessState == RPS_ResultReadFail)) Sleep(0);
+		}
 
+		m_strGlassID = pGlassID;
+		m_nProcessState = RPS_CmdFileRead;
+	}
+	/*< SWK 20220413 - #4053 MOD End >*/
+
+	return TRUE;
+}
+/* <LJC 20211122 : #3820 ADD End> */
 BOOL CRawResultReader::RawMergeFileReadStop(BOOL bWait/*=TRUE*/)
 {
 	/*

--
Gitblit v1.9.3