Bläddra i källkod

TerminateThread为异步函数,返回值并不能说明线程已结束,需要通过WaitForSingleObject来判断线程是否退出;
TerminateProcess同样为异步函数,判断方式同上;

scbc.sat2 5 år sedan
förälder
incheckning
7948eb57af
2 ändrade filer med 36 tillägg och 29 borttagningar
  1. 30 27
      SATService/SATService/PythonExecutor.cpp
  2. 6 2
      SATService/SATService/SATExecutor.cpp

+ 30 - 27
SATService/SATService/PythonExecutor.cpp

@@ -61,6 +61,7 @@ DWORD CPythonExecutor::_WorkerThread(LPVOID lpParam)
 	Sleep(2000);
 	Sleep(2000);
 	// 结束日志线程;
 	// 结束日志线程;
 	that->m_bStopLogExport = TRUE;
 	that->m_bStopLogExport = TRUE;
+	// 可能出错:m_pCaseObj可能会提前释放了,所以需要保证不能提前释放;
 	GLOBAL::WriteTextLog(_T("脚本执行线程结束,用例名=%s"), that->m_pCaseObj->strCaseName.c_str());
 	GLOBAL::WriteTextLog(_T("脚本执行线程结束,用例名=%s"), that->m_pCaseObj->strCaseName.c_str());
 
 
 	return 0;
 	return 0;
@@ -428,9 +429,9 @@ void CPythonExecutor::EndLogThread()
 {
 {
 	// 标记结束;
 	// 标记结束;
 	m_bStopLogExport = TRUE;
 	m_bStopLogExport = TRUE;
-	// 等待3秒,是否能自主结束线程;
+	// 等待5秒,是否能自主结束线程;
 	if ( m_hStdoutLogThread ) {
 	if ( m_hStdoutLogThread ) {
-		if ( WaitForSingleObject(m_hStdoutLogThread, 3000) == WAIT_OBJECT_0 ) {
+		if ( WaitForSingleObject(m_hStdoutLogThread, 5000) == WAIT_OBJECT_0 ) {
 			CloseHandle(m_hStdoutLogThread);
 			CloseHandle(m_hStdoutLogThread);
 			m_hStdoutLogThread = NULL;
 			m_hStdoutLogThread = NULL;
 		}	
 		}	
@@ -438,19 +439,21 @@ void CPythonExecutor::EndLogThread()
 
 
 	// 手动结束线程;
 	// 手动结束线程;
 	if (m_hStdoutLogThread) {
 	if (m_hStdoutLogThread) {
-		// 尝试5次结束行为;
-		for (int i = 0; i < 5; i++) {
-			if (TerminateThread(m_hStdoutLogThread, 0))
-				break;
+		TerminateThread(m_hStdoutLogThread, 0);
+		// 异步结束,需要等待(5秒)系统完成操作;
+		if ( WaitForSingleObject(m_hStdoutLogThread, 5000) == WAIT_OBJECT_0 ) {
+			CloseHandle(m_hStdoutLogThread);
+			m_hStdoutLogThread = NULL;
+		}
+		else
+		{
+			GLOBAL::WriteTextLog(_T("结束标准输出日志线程失败"));
 		}
 		}
-
-		CloseHandle(m_hStdoutLogThread);
-		m_hStdoutLogThread = NULL;
 	}
 	}
 
 
 	//////////////////////////////////////////////////////////////////////////
 	//////////////////////////////////////////////////////////////////////////
 	if ( m_hStderrLogThread ) {
 	if ( m_hStderrLogThread ) {
-		if ( WaitForSingleObject(m_hStderrLogThread, 3000) == WAIT_OBJECT_0 ) {
+		if ( WaitForSingleObject(m_hStderrLogThread, 5000) == WAIT_OBJECT_0 ) {
 			CloseHandle(m_hStderrLogThread);
 			CloseHandle(m_hStderrLogThread);
 			m_hStderrLogThread = NULL;
 			m_hStderrLogThread = NULL;
 		}	
 		}	
@@ -458,14 +461,16 @@ void CPythonExecutor::EndLogThread()
 
 
 	// 手动结束线程;
 	// 手动结束线程;
 	if (m_hStderrLogThread) {
 	if (m_hStderrLogThread) {
-		// 尝试5次结束行为;
-		for (int i = 0; i < 5; i++) {
-			if (TerminateThread(m_hStderrLogThread, 0))
-				break;
+		TerminateThread(m_hStderrLogThread, 0);
+		// 异步结束,需要等待(5秒)系统完成操作;
+		if ( WaitForSingleObject(m_hStderrLogThread, 5000) == WAIT_OBJECT_0 ) {
+			CloseHandle(m_hStderrLogThread);
+			m_hStderrLogThread = NULL;
+		}	
+		else
+		{
+			GLOBAL::WriteTextLog(_T("结束标准错误日志线程失败"));
 		}
 		}
-
-		CloseHandle(m_hStderrLogThread);
-		m_hStderrLogThread = NULL;
 	}
 	}
 }
 }
 
 
@@ -477,16 +482,16 @@ void CPythonExecutor::EndThread()
 
 
 BOOL CPythonExecutor::EndSubprocess()
 BOOL CPythonExecutor::EndSubprocess()
 {
 {
-	BOOL ret = false;
-	if (m_pi.hProcess) {
-		// 尝试5次结束;
-		for (int i = 0; i < 5; i++) {
-			if ( (ret = TerminateProcess(m_pi.hProcess, 0)) )
-				break;
-		}
+	// 注意TerminateProcess是异步的;
+	TerminateProcess(m_pi.hProcess, 0);
+	// 异步结束,需要等待(5秒)系统完成操作;
+	if ( WaitForSingleObject(m_pi.hProcess, 5000) == WAIT_OBJECT_0 ) {
+		GLOBAL::WriteTextLog(_T("结束进程(%ld)成功"), m_pi.dwProcessId);
+		return true;
 	}
 	}
 
 
-	return ret;
+	GLOBAL::WriteTextLog(_T("结束进程(%ld)失败"), m_pi.dwProcessId);
+	return false;
 }
 }
 
 
 void CPythonExecutor::EndSubprocessStdOut()
 void CPythonExecutor::EndSubprocessStdOut()
@@ -598,7 +603,5 @@ bool CPythonExecutor::IsScriptOver()
 		return true;
 		return true;
 	}
 	}
 
 
-	//GLOBAL::WriteTextLog(_T("====>脚本(%s)未结束"), m_pCaseObj->strCaseName.c_str());
-
 	return false;
 	return false;
 }
 }

+ 6 - 2
SATService/SATService/SATExecutor.cpp

@@ -618,7 +618,9 @@ bool CSATExecutor::ReportCaseResult(SATHTTP::STTask* pTask, SATHTTP::STCase *pCa
 	GetCaseXMLResult(xmlpath, vtCaseItem);
 	GetCaseXMLResult(xmlpath, vtCaseItem);
 	// 如果测试项空,任务失败;
 	// 如果测试项空,任务失败;
 	if ( vtCaseItem.size() == 0 ) {
 	if ( vtCaseItem.size() == 0 ) {
-		pCase->_nExecutionResult = SATHTTP::ABNORMAL;
+		// 将默认成功值改为异常;
+		if ( pCase->_nExecutionResult == SATHTTP::SUCCESS )
+			pCase->_nExecutionResult = SATHTTP::ABNORMAL;
 		// 同时标记任务失败;
 		// 同时标记任务失败;
 		pTask->_nExecutionResult = SATHTTP::FAIL;
 		pTask->_nExecutionResult = SATHTTP::FAIL;
 		GLOBAL::WriteTextLog(_T("测试项空,用例名:%s"), pCase->strCaseName.c_str());
 		GLOBAL::WriteTextLog(_T("测试项空,用例名:%s"), pCase->strCaseName.c_str());
@@ -1136,10 +1138,12 @@ 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 ) {	
+								// 标记任务已执行;
+								pCase->_nExecutionState = SATHTTP::EXECUTED;
 								// 结束进程;
 								// 结束进程;
 								pExcutor->EndSubprocess();
 								pExcutor->EndSubprocess();
 								// 超时中断;
 								// 超时中断;
-								pCase->_nExecutionState = 3;
+								pCase->_nExecutionResult = SATHTTP::OVERTIME;
 								// 上报用例结果;
 								// 上报用例结果;
 								that->ReportCaseResult(pTask, pCase);
 								that->ReportCaseResult(pTask, pCase);
 								GLOBAL::WriteTextLog(_T("脚本超时:%s"), pCase->strCaseName.c_str());
 								GLOBAL::WriteTextLog(_T("脚本超时:%s"), pCase->strCaseName.c_str());