Browse Source

1、修复部分Bug;
2、简化ScriptExecutor

scbc.sat2 5 years ago
parent
commit
2a1825a1b5

+ 1 - 1
SATService/SATService/Global.cpp

@@ -199,7 +199,7 @@ namespace GLOBAL
 
 
 		g_stSATConfig.dwAdbTimeout = GetPrivateProfileInt(_T("SATService"), _T("AdbTimeout"), 120000, szIniPath);
 		g_stSATConfig.dwAdbTimeout = GetPrivateProfileInt(_T("SATService"), _T("AdbTimeout"), 120000, szIniPath);
 		g_stSATConfig.dwTCPSvrPort = GetPrivateProfileInt(_T("SATService"), _T("TCPSvrPort"), 5588, szIniPath);
 		g_stSATConfig.dwTCPSvrPort = GetPrivateProfileInt(_T("SATService"), _T("TCPSvrPort"), 5588, szIniPath);
-		g_stSATConfig.dwTCPSvrPort = GetPrivateProfileInt(_T("SATService"), _T("ScriptTimeout"), 300000, szIniPath);
+		g_stSATConfig.dwScriptTimeout = GetPrivateProfileInt(_T("SATService"), _T("ScriptTimeout"), 300000, szIniPath);
 		GetPrivateProfileString(_T("SATService"), _T("ExecuteServer"), _T(""), g_stSATConfig.szExecuteServer, MAX_PATH, szIniPath);
 		GetPrivateProfileString(_T("SATService"), _T("ExecuteServer"), _T(""), g_stSATConfig.szExecuteServer, MAX_PATH, szIniPath);
 		GetPrivateProfileString(_T("SATService"), _T("ExecuteSyscode"), _T(""), g_stSATConfig.szExecuteSysCode, MAX_PATH, szIniPath);
 		GetPrivateProfileString(_T("SATService"), _T("ExecuteSyscode"), _T(""), g_stSATConfig.szExecuteSysCode, MAX_PATH, szIniPath);
 
 

+ 1 - 1
SATService/SATService/SATDevices.cpp

@@ -323,7 +323,7 @@ void CSATDevices::GetCurrentDevices(std::vector<SATDEV::STDevice> &vtDevices)
 	// offline设备也要加入,不区分usb或reticle;
 	// offline设备也要加入,不区分usb或reticle;
 	for ( std::vector<std::string>::iterator it = vtLine.begin(); it != vtLine.end(); it++ ) {
 	for ( std::vector<std::string>::iterator it = vtLine.begin(); it != vtLine.end(); it++ ) {
 		//if ( _tcsicmp("List of devices attached ", it->c_str()) == 0 )
 		//if ( _tcsicmp("List of devices attached ", it->c_str()) == 0 )
-		if ( it->find("List of devices attached ") != std::string::npos )
+		if ( it->find("List of devices attached") != std::string::npos )
 			continue;
 			continue;
 		SATDEV::STDevice stDevice;
 		SATDEV::STDevice stDevice;
 		// 设备类型;
 		// 设备类型;

+ 9 - 2
SATService/SATService/SATExecutor.cpp

@@ -551,8 +551,8 @@ bool CSATExecutor::ReportCaseResult(SATHTTP::STTask* pTask, SATHTTP::STCase *pCa
 	xmlpath.append("_result.xml");
 	xmlpath.append("_result.xml");
 	std::vector<STCaseItem> vtCaseItem;
 	std::vector<STCaseItem> vtCaseItem;
 	GetCaseXMLResult(xmlpath, vtCaseItem);
 	GetCaseXMLResult(xmlpath, vtCaseItem);
-	if ( vtCaseItem.size() == 0 )
-		return false;
+	//if ( vtCaseItem.size() == 0 )
+	//	return false;
 	
 	
 	int nIndex = 1;
 	int nIndex = 1;
 	TCHAR szValue[MAX_PATH] = {0};
 	TCHAR szValue[MAX_PATH] = {0};
@@ -574,6 +574,11 @@ bool CSATExecutor::ReportCaseResult(SATHTTP::STTask* pTask, SATHTTP::STCase *pCa
 	// 上传用例日志;
 	// 上传用例日志;
 	UploadCaseLog(pTask, pCase);
 	UploadCaseLog(pTask, pCase);
 
 
+	// 删除执行对象;
+	if ( pCase->_pExcutor )
+		delete pCase->_pExcutor;
+	pCase->_pExcutor = NULL;
+
 	return true;
 	return true;
 }
 }
 
 
@@ -981,6 +986,8 @@ DWORD CSATExecutor::ExecuteScriptThread(LPVOID lpVoid)
 							// 判断是否超时;
 							// 判断是否超时;
 							ULONGLONG ulCurTickCount = GetTickCount64();
 							ULONGLONG ulCurTickCount = GetTickCount64();
 							if ( ulCurTickCount - pExcutor->GetActiveTickCount() > GLOBAL::g_stSATConfig.dwScriptTimeout ) {	
 							if ( ulCurTickCount - pExcutor->GetActiveTickCount() > GLOBAL::g_stSATConfig.dwScriptTimeout ) {	
+								// 结束进程;
+								pExcutor->EndSubprocess();
 								// 超时中断;
 								// 超时中断;
 								pCase->_nExecutionState = 3;
 								pCase->_nExecutionState = 3;
 								// 上报用例结果;
 								// 上报用例结果;

+ 15 - 15
SATService/SATService/SATTCPServer.cpp

@@ -724,7 +724,7 @@ void CSATTCPServer::_RecvProcess(PER_SOCKET_CONTEXT* pSocketContext, PER_IO_CONT
 #ifdef _DEBUG
 #ifdef _DEBUG
 	OutputDebugString("有数据返回\n");
 	OutputDebugString("有数据返回\n");
 #endif
 #endif
-	GLOBAL::WriteTextLog("有数据返回");
+	//GLOBAL::WriteTextLog("有数据返回");
 	// 小于包头;
 	// 小于包头;
 	SATPROTO::DataHeader* phead = NULL;
 	SATPROTO::DataHeader* phead = NULL;
 	if (pSocketContext->lastData.size() == 0)
 	if (pSocketContext->lastData.size() == 0)
@@ -733,7 +733,7 @@ void CSATTCPServer::_RecvProcess(PER_SOCKET_CONTEXT* pSocketContext, PER_IO_CONT
 		if (PAK_LEN > pIoContext->m_Overlapped.InternalHigh)
 		if (PAK_LEN > pIoContext->m_Overlapped.InternalHigh)
 		{
 		{
 			OutputDebugString("A:不足包头;\n");
 			OutputDebugString("A:不足包头;\n");
-			GLOBAL::WriteTextLog("A:不足包头");
+			//GLOBAL::WriteTextLog("A:不足包头");
 			pSocketContext->lastData.append(pIoContext->m_wsaBuf.buf, pIoContext->m_Overlapped.InternalHigh);
 			pSocketContext->lastData.append(pIoContext->m_wsaBuf.buf, pIoContext->m_Overlapped.InternalHigh);
 		}
 		}
 		else
 		else
@@ -743,7 +743,7 @@ void CSATTCPServer::_RecvProcess(PER_SOCKET_CONTEXT* pSocketContext, PER_IO_CONT
 			if ( !CheckDataHeader(phead) )
 			if ( !CheckDataHeader(phead) )
 			{
 			{
 				OutputDebugString("A:包头损坏;\n");
 				OutputDebugString("A:包头损坏;\n");
-				GLOBAL::WriteTextLog("A:包头损坏");
+				//GLOBAL::WriteTextLog("A:包头损坏");
 				return;
 				return;
 			}
 			}
 
 
@@ -751,21 +751,21 @@ void CSATTCPServer::_RecvProcess(PER_SOCKET_CONTEXT* pSocketContext, PER_IO_CONT
 			if (phead->len == pIoContext->m_Overlapped.InternalHigh)
 			if (phead->len == pIoContext->m_Overlapped.InternalHigh)
 			{
 			{
 				OutputDebugString("A:完整的包;\n");
 				OutputDebugString("A:完整的包;\n");
-				GLOBAL::WriteTextLog("A:完整的包");
+				//GLOBAL::WriteTextLog("A:完整的包");
 				_TaskProcess(pIoContext, (SATPROTO::Package*)pIoContext->m_wsaBuf.buf);
 				_TaskProcess(pIoContext, (SATPROTO::Package*)pIoContext->m_wsaBuf.buf);
 			}
 			}
 			// 小包;
 			// 小包;
 			else if (phead->len > pIoContext->m_Overlapped.InternalHigh)
 			else if (phead->len > pIoContext->m_Overlapped.InternalHigh)
 			{
 			{
 				OutputDebugString("A:小包;\n");
 				OutputDebugString("A:小包;\n");
-				GLOBAL::WriteTextLog("A:小包");
+				//GLOBAL::WriteTextLog("A:小包");
 				pSocketContext->lastData.append(pIoContext->m_wsaBuf.buf, pIoContext->m_Overlapped.InternalHigh);
 				pSocketContext->lastData.append(pIoContext->m_wsaBuf.buf, pIoContext->m_Overlapped.InternalHigh);
 			}
 			}
 			// 超包;
 			// 超包;
 			else if (phead->len < pIoContext->m_Overlapped.InternalHigh)
 			else if (phead->len < pIoContext->m_Overlapped.InternalHigh)
 			{
 			{
 				OutputDebugString("A:超包;\n");
 				OutputDebugString("A:超包;\n");
-				GLOBAL::WriteTextLog("A:超包");
+				//GLOBAL::WriteTextLog("A:超包");
 				pSocketContext->lastData.append(pIoContext->m_wsaBuf.buf + phead->len, pIoContext->m_Overlapped.InternalHigh - phead->len);
 				pSocketContext->lastData.append(pIoContext->m_wsaBuf.buf + phead->len, pIoContext->m_Overlapped.InternalHigh - phead->len);
 				_TaskProcess(pIoContext, (SATPROTO::Package*)pIoContext->m_wsaBuf.buf);
 				_TaskProcess(pIoContext, (SATPROTO::Package*)pIoContext->m_wsaBuf.buf);
 			}
 			}
@@ -780,7 +780,7 @@ void CSATTCPServer::_RecvProcess(PER_SOCKET_CONTEXT* pSocketContext, PER_IO_CONT
 			if ( !CheckDataHeader(phead) )
 			if ( !CheckDataHeader(phead) )
 			{
 			{
 				OutputDebugString("C:包头损坏;\n");
 				OutputDebugString("C:包头损坏;\n");
-				GLOBAL::WriteTextLog("C:包头损坏");
+				//GLOBAL::WriteTextLog("C:包头损坏");
 				pSocketContext->lastData.clear();
 				pSocketContext->lastData.clear();
 				return;
 				return;
 			}
 			}
@@ -790,7 +790,7 @@ void CSATTCPServer::_RecvProcess(PER_SOCKET_CONTEXT* pSocketContext, PER_IO_CONT
 				if ( phead->len <= pSocketContext->lastData.size() )
 				if ( phead->len <= pSocketContext->lastData.size() )
 				{
 				{
 					OutputDebugString("C:超包;\n");
 					OutputDebugString("C:超包;\n");
-					GLOBAL::WriteTextLog("C:超包");
+					//GLOBAL::WriteTextLog("C:超包");
 					// 完整包;
 					// 完整包;
 					_TaskProcess(pIoContext, (SATPROTO::Package*)pSocketContext->lastData.substr(0, phead->len).data());
 					_TaskProcess(pIoContext, (SATPROTO::Package*)pSocketContext->lastData.substr(0, phead->len).data());
 
 
@@ -800,7 +800,7 @@ void CSATTCPServer::_RecvProcess(PER_SOCKET_CONTEXT* pSocketContext, PER_IO_CONT
 				else
 				else
 				{
 				{
 					OutputDebugString("D:超包;\n");
 					OutputDebugString("D:超包;\n");
-					GLOBAL::WriteTextLog("D:超包");
+					//GLOBAL::WriteTextLog("D:超包");
 					lastlen = pSocketContext->lastData.size() + pIoContext->m_Overlapped.InternalHigh - phead->len;
 					lastlen = pSocketContext->lastData.size() + pIoContext->m_Overlapped.InternalHigh - phead->len;
 					pSocketContext->lastData.append(pIoContext->m_wsaBuf.buf, pIoContext->m_Overlapped.InternalHigh - lastlen);
 					pSocketContext->lastData.append(pIoContext->m_wsaBuf.buf, pIoContext->m_Overlapped.InternalHigh - lastlen);
 					// 完整包;
 					// 完整包;
@@ -814,7 +814,7 @@ void CSATTCPServer::_RecvProcess(PER_SOCKET_CONTEXT* pSocketContext, PER_IO_CONT
 			else
 			else
 			{
 			{
 				OutputDebugString("C:仍不足一个包;\n");
 				OutputDebugString("C:仍不足一个包;\n");
-				GLOBAL::WriteTextLog("C:仍不足一个包");
+				//GLOBAL::WriteTextLog("C:仍不足一个包");
 				pSocketContext->lastData.append(pIoContext->m_wsaBuf.buf, pIoContext->m_Overlapped.InternalHigh);
 				pSocketContext->lastData.append(pIoContext->m_wsaBuf.buf, pIoContext->m_Overlapped.InternalHigh);
 			}
 			}
 		}
 		}
@@ -826,7 +826,7 @@ void CSATTCPServer::_RecvProcess(PER_SOCKET_CONTEXT* pSocketContext, PER_IO_CONT
 			if ( diflen > pIoContext->m_Overlapped.InternalHigh )
 			if ( diflen > pIoContext->m_Overlapped.InternalHigh )
 			{
 			{
 				OutputDebugString("B:仍不足一个包头;\n");
 				OutputDebugString("B:仍不足一个包头;\n");
-				GLOBAL::WriteTextLog("B:仍不足一个包头");
+				//GLOBAL::WriteTextLog("B:仍不足一个包头");
 				pSocketContext->lastData.append(pIoContext->m_wsaBuf.buf, pIoContext->m_Overlapped.InternalHigh);
 				pSocketContext->lastData.append(pIoContext->m_wsaBuf.buf, pIoContext->m_Overlapped.InternalHigh);
 			}
 			}
 			else
 			else
@@ -837,7 +837,7 @@ void CSATTCPServer::_RecvProcess(PER_SOCKET_CONTEXT* pSocketContext, PER_IO_CONT
 				if ( !CheckDataHeader(phead) )
 				if ( !CheckDataHeader(phead) )
 				{
 				{
 					OutputDebugString("B:包头损坏;\n");
 					OutputDebugString("B:包头损坏;\n");
-					GLOBAL::WriteTextLog("B:包头损坏");
+					//GLOBAL::WriteTextLog("B:包头损坏");
 					pSocketContext->lastData.clear();
 					pSocketContext->lastData.clear();
 					return;
 					return;
 				}
 				}
@@ -846,7 +846,7 @@ void CSATTCPServer::_RecvProcess(PER_SOCKET_CONTEXT* pSocketContext, PER_IO_CONT
 				if ( phead->len == PAK_LEN + pIoContext->m_Overlapped.InternalHigh - diflen )
 				if ( phead->len == PAK_LEN + pIoContext->m_Overlapped.InternalHigh - diflen )
 				{
 				{
 					OutputDebugString("B:完整包;\n");
 					OutputDebugString("B:完整包;\n");
-					GLOBAL::WriteTextLog("B:完整包");
+					//GLOBAL::WriteTextLog("B:完整包");
 					pSocketContext->lastData.append(pIoContext->m_wsaBuf.buf + diflen, pIoContext->m_Overlapped.InternalHigh - diflen);
 					pSocketContext->lastData.append(pIoContext->m_wsaBuf.buf + diflen, pIoContext->m_Overlapped.InternalHigh - diflen);
 					_TaskProcess(pIoContext, (SATPROTO::Package*)pSocketContext->lastData.data());
 					_TaskProcess(pIoContext, (SATPROTO::Package*)pSocketContext->lastData.data());
 					pSocketContext->lastData.clear();
 					pSocketContext->lastData.clear();
@@ -855,14 +855,14 @@ void CSATTCPServer::_RecvProcess(PER_SOCKET_CONTEXT* pSocketContext, PER_IO_CONT
 				else if ( phead->len > PAK_LEN + pIoContext->m_Overlapped.InternalHigh - diflen)
 				else if ( phead->len > PAK_LEN + pIoContext->m_Overlapped.InternalHigh - diflen)
 				{
 				{
 					OutputDebugString("B:小包;\n");
 					OutputDebugString("B:小包;\n");
-					GLOBAL::WriteTextLog("B:小包");
+					//GLOBAL::WriteTextLog("B:小包");
 					pSocketContext->lastData.append(pIoContext->m_wsaBuf.buf + diflen, pIoContext->m_Overlapped.InternalHigh - diflen);
 					pSocketContext->lastData.append(pIoContext->m_wsaBuf.buf + diflen, pIoContext->m_Overlapped.InternalHigh - diflen);
 				}
 				}
 				// 超包;
 				// 超包;
 				else if (phead->len < PAK_LEN + pIoContext->m_Overlapped.InternalHigh - diflen)
 				else if (phead->len < PAK_LEN + pIoContext->m_Overlapped.InternalHigh - diflen)
 				{
 				{
 					OutputDebugString("B:超包;\n");
 					OutputDebugString("B:超包;\n");
-					GLOBAL::WriteTextLog("B:超包");
+					//GLOBAL::WriteTextLog("B:超包");
 					// 组完成包;
 					// 组完成包;
 					pSocketContext->lastData.append(pIoContext->m_wsaBuf.buf + diflen, phead->len - PAK_LEN);
 					pSocketContext->lastData.append(pIoContext->m_wsaBuf.buf + diflen, phead->len - PAK_LEN);
 					_TaskProcess(pIoContext, (SATPROTO::Package*)pSocketContext->lastData.data());
 					_TaskProcess(pIoContext, (SATPROTO::Package*)pSocketContext->lastData.data());

+ 55 - 90
SATService/SATService/ScriptExecutor.cpp

@@ -21,9 +21,7 @@ SERVICE_STATUS_HANDLE hServiceStatus;
 CScriptExecutor::CScriptExecutor(void)
 CScriptExecutor::CScriptExecutor(void)
 {
 {
 	m_hWorkThread = NULL;
 	m_hWorkThread = NULL;
-	m_hWorkEvent = NULL;
 	m_hLogThread = NULL;
 	m_hLogThread = NULL;
-	m_hLogEvent = NULL;
 	m_bStatus = FALSE;
 	m_bStatus = FALSE;
 	m_nRunType = 0;
 	m_nRunType = 0;
 	m_hStdOutRead = NULL;
 	m_hStdOutRead = NULL;
@@ -57,8 +55,7 @@ CScriptExecutor::~CScriptExecutor(void)
 DWORD CScriptExecutor::_WorkerThread(LPVOID lpParam)
 DWORD CScriptExecutor::_WorkerThread(LPVOID lpParam)
 {
 {
 	CScriptExecutor* that = (CScriptExecutor*)lpParam;
 	CScriptExecutor* that = (CScriptExecutor*)lpParam;
-	if ( !that )
-	{
+	if ( !that ) {
 		printf("Error:参数失效\n");
 		printf("Error:参数失效\n");
 		return -1;
 		return -1;
 	}
 	}
@@ -78,11 +75,11 @@ DWORD CScriptExecutor::_WorkerThread(LPVOID lpParam)
 #endif
 #endif
 	}
 	}
 
 
-	CloseHandle(that->m_hWorkThread);
-	that->m_hWorkThread = NULL;
-
+	// 延时;
+	Sleep(2000);
 	// 结束日志线程;
 	// 结束日志线程;
 	that->m_bStopLogExport = TRUE;
 	that->m_bStopLogExport = TRUE;
+	GLOBAL::WriteTextLog(_T("脚本执行线程结束,用例名=%s"), that->m_pCaseObj->strCaseName.c_str());
 
 
 	return 0;
 	return 0;
 }
 }
@@ -90,8 +87,7 @@ DWORD CScriptExecutor::_WorkerThread(LPVOID lpParam)
 DWORD CScriptExecutor::_LogExportThread(LPVOID lpParam)
 DWORD CScriptExecutor::_LogExportThread(LPVOID lpParam)
 {
 {
 	CScriptExecutor* that = (CScriptExecutor*)lpParam;
 	CScriptExecutor* that = (CScriptExecutor*)lpParam;
-	if (!that)
-	{
+	if (!that) {
 		printf("Error:参数失效\n");
 		printf("Error:参数失效\n");
 		return -1;
 		return -1;
 	}
 	}
@@ -143,6 +139,7 @@ DWORD CScriptExecutor::_LogExportThread(LPVOID lpParam)
 
 
 	// 结束重定向;
 	// 结束重定向;
 	that->EndSubprocessStdOut();
 	that->EndSubprocessStdOut();
+	GLOBAL::WriteTextLog(_T("脚本日志线程结束,用例名=%s"), that->m_pCaseObj->strCaseName.c_str());
 
 
 	return 0;
 	return 0;
 }
 }
@@ -395,7 +392,6 @@ int CScriptExecutor::RunEmbeddedScript()
 		return -4;
 		return -4;
 	}
 	}
 
 
-	m_bRuned = TRUE; 
 	// 执行main函数;
 	// 执行main函数;
 	PyObject* pResult = PyObject_CallObject(pFunction, NULL);
 	PyObject* pResult = PyObject_CallObject(pFunction, NULL);
 	if (!pResult)
 	if (!pResult)
@@ -407,6 +403,11 @@ int CScriptExecutor::RunEmbeddedScript()
 		return -5;
 		return -5;
 	}
 	}
 
 
+	// 延时;
+	Sleep(2000);
+	// 结束日志线程;
+	m_bStopLogExport = TRUE;
+
 	Py_DECREF(pResult);
 	Py_DECREF(pResult);
 
 
 	Py_Finalize();
 	Py_Finalize();
@@ -454,7 +455,7 @@ int CScriptExecutor::RunScriptProcess()
 		&m_pi)					// Pointer to PROCESS_INFORMATION structure
 		&m_pi)					// Pointer to PROCESS_INFORMATION structure
 		)
 		)
 	{
 	{
-		printf("Error:创建子进程失败 (%d).\n", GetLastError());
+		GLOBAL::WriteTextLog("Error:创建子进程失败 (%d)", GetLastError());
 		return -3;
 		return -3;
 	}
 	}
 
 
@@ -464,6 +465,7 @@ int CScriptExecutor::RunScriptProcess()
 	WaitForSingleObject(m_pi.hProcess, INFINITE);
 	WaitForSingleObject(m_pi.hProcess, INFINITE);
 
 
 	Sleep(5000);
 	Sleep(5000);
+	GLOBAL::WriteTextLog("脚本进程结束(%ld)",  m_pi.dwProcessId);
 	// 结束日志线程;
 	// 结束日志线程;
 	m_bStopLogExport = TRUE;
 	m_bStopLogExport = TRUE;
 
 
@@ -641,27 +643,13 @@ int CScriptExecutor::ServiceRunScriptProcess()
 	return TRUE;
 	return TRUE;
 }
 }
 
 
-bool CScriptExecutor::StartWorkThread()
+bool CScriptExecutor::StartThread()
 {
 {
 	// 创建线程;
 	// 创建线程;
 	m_hWorkThread = CreateThread(NULL, 0, _WorkerThread, this, 0, &m_dwThreadId);
 	m_hWorkThread = CreateThread(NULL, 0, _WorkerThread, this, 0, &m_dwThreadId);
 	if (!m_hWorkThread)
 	if (!m_hWorkThread)
 	{
 	{
-		printf("Error:创建线程失败\n");
-		return false;
-	}
-
-	return true;
-}
-
-bool CScriptExecutor::StartLogThread()
-{
-	printf("StartLogThread\n");
-	// 创建线程事件:手动控制,无信号状态;
-	m_hLogEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
-	if (!m_hLogEvent)
-	{
-		printf("Error:无法为线程创建控制事件\n");
+		printf("Error:创建执行线程失败\n");
 		return false;
 		return false;
 	}
 	}
 
 
@@ -669,10 +657,7 @@ bool CScriptExecutor::StartLogThread()
 	m_hLogThread = CreateThread(NULL, 0, _LogExportThread, this, CREATE_SUSPENDED, NULL);
 	m_hLogThread = CreateThread(NULL, 0, _LogExportThread, this, CREATE_SUSPENDED, NULL);
 	if (!m_hLogThread)
 	if (!m_hLogThread)
 	{
 	{
-		printf("Error:创建线程失败\n");
-		CloseHandle(m_hLogEvent);
-		m_hLogEvent = NULL;
-
+		printf("Error:创建日志线程失败\n");
 		return false;
 		return false;
 	}
 	}
 
 
@@ -681,12 +666,21 @@ bool CScriptExecutor::StartLogThread()
 
 
 void CScriptExecutor::EndWorkThread()
 void CScriptExecutor::EndWorkThread()
 {
 {
-	// 等待线程结束;
-	if (m_hWorkThread)
-	{
+	// 结束进程;
+	EndSubprocess();
+	// 等待3秒,是否能自主结束线程;
+	if (m_hWorkThread) {
+		if (WaitForSingleObject(m_hWorkThread, 3000) == WAIT_OBJECT_0) {
+			CloseHandle(m_hWorkThread);
+			m_hWorkThread = NULL;
+			return;
+		}
+	}
+
+	// 手动结束线程;
+	if ( m_hWorkThread ) {
 		// 尝试5次结束行为;
 		// 尝试5次结束行为;
-		for (int i = 0; i < 5; i++)
-		{
+		for (int i = 0; i < 5; i++) {
 			if (TerminateThread(m_hWorkThread, 0))
 			if (TerminateThread(m_hWorkThread, 0))
 				break;
 				break;
 		}
 		}
@@ -698,42 +692,33 @@ void CScriptExecutor::EndWorkThread()
 
 
 void CScriptExecutor::EndLogThread()
 void CScriptExecutor::EndLogThread()
 {
 {
-	// 设置事件有信号;
-	if (m_hLogEvent)
-		SetEvent(m_hLogEvent);
+	m_bStopLogExport = TRUE;
+	// 等待3秒,是否能自主结束线程;
+	if ( m_hLogThread ) {
+		if ( WaitForSingleObject(m_hLogThread, 3000) == WAIT_OBJECT_0 ) {
+			CloseHandle(m_hLogThread);
+			m_hLogThread = NULL;
+			return;
+		}	
+	}
+
+	// 手动结束线程;
+	if (m_hLogThread) {
+		// 尝试5次结束行为;
+		for (int i = 0; i < 5; i++) {
+			if (TerminateThread(m_hLogThread, 0))
+				break;
+		}
 
 
-	// 等待线程结束;
-	if (m_hLogThread)
-	{
-		WaitForSingleObject(m_hLogThread, INFINITE);
 		CloseHandle(m_hLogThread);
 		CloseHandle(m_hLogThread);
 		m_hLogThread = NULL;
 		m_hLogThread = NULL;
 	}
 	}
-
-	// 关闭句柄;
-	if (m_hLogEvent)
-		CloseHandle(m_hLogEvent);
-	m_hLogEvent = NULL;
 }
 }
 
 
-void CScriptExecutor::EndThread(HANDLE hThread, HANDLE hEvent)
+void CScriptExecutor::EndThread()
 {
 {
-	// 设置事件有信号;
-	if (hEvent)
-		SetEvent(hEvent);
-
-	// 等待线程结束;
-	if (hThread)
-	{
-		WaitForSingleObject(hThread, INFINITE);
-		CloseHandle(hThread);
-		hThread = NULL;
-	}
-
-	// 关闭句柄;
-	if (hEvent)
-		CloseHandle(hEvent);
-	hEvent = NULL;
+	EndWorkThread();
+	EndLogThread();
 }
 }
 
 
 BOOL CScriptExecutor::EndSubprocess()
 BOOL CScriptExecutor::EndSubprocess()
@@ -1035,16 +1020,8 @@ bool CScriptExecutor::InitScript(std::string strScript, std::string strLogPath,
 
 
 bool CScriptExecutor::StartScript()
 bool CScriptExecutor::StartScript()
 {
 {
-	if (StartWorkThread())
-	{
-		// 开启日志导出线程;
-		if (!StartLogThread())
-		{
-			printf("Error:日志导出线程创建出错\n");
-		}
-
+	if (StartThread()) {
 		Sleep(100);
 		Sleep(100);
-
 		return true;
 		return true;
 	}
 	}
 
 
@@ -1066,24 +1043,12 @@ void CScriptExecutor::StopScript()
 
 
 bool CScriptExecutor::IsScriptOver()
 bool CScriptExecutor::IsScriptOver()
 {
 {
-	int i = 10;
-	while (!m_bRuned)
-	{
-		Sleep(300);
-		if ( --i == 0 )
-			break;
-	}
-
-	if (m_nRunType == EMBEDDED)
+	if ( WaitForSingleObject(m_hLogThread, 0) == WAIT_OBJECT_0 )
 	{
 	{
-		if ( m_hWorkThread == NULL )
-			return true;
-	}
-	else if (m_nRunType == SUBPROCESS)
-	{
-		if ( m_pi.hProcess == NULL && m_hWorkThread == NULL )
-			return true;
+		GLOBAL::WriteTextLog(_T("脚本(%s)已完成"), m_pCaseObj->strCaseName.c_str());
+		return true;
 	}
 	}
 
 
+	GLOBAL::WriteTextLog(_T("脚本(%s)未完成"), m_pCaseObj->strCaseName.c_str());
 	return false;
 	return false;
 }
 }

+ 4 - 7
SATService/SATService/ScriptExecutor.h

@@ -19,9 +19,7 @@ public:
 protected:
 protected:
 	SATHTTP::STCase *m_pCaseObj;						// 用例对象;
 	SATHTTP::STCase *m_pCaseObj;						// 用例对象;
 	HANDLE			m_hWorkThread;						// 事件句柄;
 	HANDLE			m_hWorkThread;						// 事件句柄;
-	HANDLE			m_hWorkEvent;						// 线程事件;
 	HANDLE			m_hLogThread;						// 事件句柄;
 	HANDLE			m_hLogThread;						// 事件句柄;
-	HANDLE			m_hLogEvent;						// 线程事件;
 	BOOL			m_bStatus;							// 线程状态;
 	BOOL			m_bStatus;							// 线程状态;
 	TCHAR			m_szScriptPath[MAX_PATH];			// 脚本路径;
 	TCHAR			m_szScriptPath[MAX_PATH];			// 脚本路径;
 	TCHAR			m_szLogPath[MAX_PATH];				// 日志路径;	
 	TCHAR			m_szLogPath[MAX_PATH];				// 日志路径;	
@@ -68,14 +66,11 @@ protected:
 	// 在服务进程中创建脚本进程;
 	// 在服务进程中创建脚本进程;
 	int ServiceRunScriptProcess();
 	int ServiceRunScriptProcess();
 	// 开启线程;
 	// 开启线程;
-	bool StartWorkThread();
-	bool StartLogThread();
+	bool StartThread();
 	// 结束线程;
 	// 结束线程;
 	void EndWorkThread();
 	void EndWorkThread();
 	void EndLogThread();
 	void EndLogThread();
-	void EndThread(HANDLE hThread, HANDLE hEvent);
-	// 结束子进程;
-	BOOL EndSubprocess();
+	void EndThread();
 	// 从管道读取日志;
 	// 从管道读取日志;
 	void ReadFromPipe();
 	void ReadFromPipe();
 	// 结束重定向句柄,恢复默认;
 	// 结束重定向句柄,恢复默认;
@@ -109,6 +104,8 @@ public:
 	}
 	}
 	// 设置用例对象;
 	// 设置用例对象;
 	void SetCaseObje(SATHTTP::STCase *pObj){ m_pCaseObj = pObj;}
 	void SetCaseObje(SATHTTP::STCase *pObj){ m_pCaseObj = pObj;}
+	// 结束子进程;
+	BOOL EndSubprocess();
 	// 获取活动的CPU时间;
 	// 获取活动的CPU时间;
 	ULONGLONG GetActiveTickCount() const { return m_ulStartTickCount;}
 	ULONGLONG GetActiveTickCount() const { return m_ulStartTickCount;}
 };
 };