浏览代码

1、新增:DelFinishedTask
2、要使用WaitForSingleObject不可提前结束句柄;

scbc.sat2 5 年之前
父节点
当前提交
69a8ee3fd3

+ 22 - 0
SATService/SATService/SATExecutor.cpp

@@ -55,6 +55,25 @@ SATHTTP::STTask* CSATExecutor::GetFreeTask()
 	return NULL;
 }
 
+void CSATExecutor::DelFinishedTask()
+{
+	AutoThreadSection ats(&m_csTask);
+	std::list<SATHTTP::STTask>::iterator it = m_vtTask.begin();
+	for ( ; it != m_vtTask.end(); it++ ) {
+		// 状态为2的完成任务;
+		if ( it->_nExecutionState == 2 ) {
+			// 删除所有执行器对象;
+			for (std::vector<SATHTTP::STCase>::iterator _case = it->Job.vtCases.begin(); _case != it->Job.vtCases.end(); _case++ ) {
+				if ( _case->_pExcutor )
+					delete _case->_pExcutor;
+				_case->_pExcutor = NULL;
+			}
+			m_vtTask.erase(it);
+			break;
+		}
+	}
+}
+
 SATHTTP::STCase* CSATExecutor::IsCaseScriptProcess(std::vector<SATHTTP::STCase> &vtCases)
 {
 	std::vector<SATHTTP::STCase>::iterator it = vtCases.begin();
@@ -578,6 +597,7 @@ bool CSATExecutor::ReportCaseResult(SATHTTP::STTask* pTask, SATHTTP::STCase *pCa
 	if ( pCase->_pExcutor )
 		delete pCase->_pExcutor;
 	pCase->_pExcutor = NULL;
+	GLOBAL::WriteTextLog(_T("执行器对象删除成功,脚本用例名为=%s"), pCase->strCaseName.c_str());
 
 	return true;
 }
@@ -965,6 +985,8 @@ DWORD CSATExecutor::ExecuteScriptThread(LPVOID lpVoid)
 	if ( !that ) return 0;
 
 	do {
+		// 删除已完成的任务;
+		that->DelFinishedTask();
 		// 是否有任务在执行;
 		SATHTTP::STTask *pTask = that->IsThereATaskInProcess();
 		if ( pTask ) {// 有任务在执行中;

+ 2 - 0
SATService/SATService/SATExecutor.h

@@ -62,6 +62,8 @@ protected:
 	SATHTTP::STTask* IsThereATaskInProcess();
 	// 提取未执行的任务;
 	SATHTTP::STTask* GetFreeTask();
+	// 移除已完成的任务;
+	void DelFinishedTask();
 	// 是否有用例脚本在执行;
 	SATHTTP::STCase* IsCaseScriptProcess(std::vector<SATHTTP::STCase> &vtCases);
 	// 提取未执行的用例;

+ 1 - 2
SATService/SATService/SATTCPServer.cpp

@@ -883,8 +883,7 @@ void CSATTCPServer::_TaskProcess(PER_IO_CONTEXT* pIoContext, SATPROTO::Package*
 #ifdef _DEBUG
 	OutputDebugString("\n########成功获取数据########\n\n");
 #endif
-	GLOBAL::WriteTextLog("成功获取数据");
-
+	//GLOBAL::WriteTextLog("成功获取数据");
 	SATPROTO::DataHeader *pHeader = &pak->header;
 	if ( !pHeader ) 
 		return;

+ 17 - 7
SATService/SATService/ScriptExecutor.cpp

@@ -133,10 +133,6 @@ DWORD CScriptExecutor::_LogExportThread(LPVOID lpParam)
 		} while (!that->m_bStopLogExport);
 	}
 
-	// 关闭线程句柄;
-	CloseHandle(that->m_hLogThread);
-	that->m_hLogThread = NULL;
-
 	// 结束重定向;
 	that->EndSubprocessStdOut();
 	GLOBAL::WriteTextLog(_T("脚本日志线程结束,用例名=%s"), that->m_pCaseObj->strCaseName.c_str());
@@ -407,6 +403,11 @@ int CScriptExecutor::RunEmbeddedScript()
 	Sleep(2000);
 	// 结束日志线程;
 	m_bStopLogExport = TRUE;
+	// 同时需要关闭输出的管道,否则ReadFile会阻塞;
+	CloseHandle(m_hStdOutWrite);
+	m_hStdOutWrite = NULL;
+	CloseHandle(m_hStdErrorWrite);
+	m_hStdErrorWrite = NULL;
 
 	Py_DECREF(pResult);
 
@@ -468,6 +469,11 @@ int CScriptExecutor::RunScriptProcess()
 	GLOBAL::WriteTextLog("脚本进程结束(%ld)",  m_pi.dwProcessId);
 	// 结束日志线程;
 	m_bStopLogExport = TRUE;
+	// 同时需要关闭输出的管道,否则ReadFile会阻塞;
+	CloseHandle(m_hStdOutWrite);
+	m_hStdOutWrite = NULL;
+	CloseHandle(m_hStdErrorWrite);
+	m_hStdErrorWrite = NULL;
 
 	// 关闭进程句柄. 
 	CloseHandle(m_pi.hProcess);
@@ -625,6 +631,11 @@ int CScriptExecutor::ServiceRunScriptProcess()
 	// 关闭进程句柄. 
 	CloseHandle(m_pi.hProcess);
 	CloseHandle(m_pi.hThread);
+	// 同时需要关闭输出的管道,否则ReadFile会阻塞;
+	CloseHandle(m_hStdOutWrite);
+	m_hStdOutWrite = NULL;
+	CloseHandle(m_hStdErrorWrite);
+	m_hStdErrorWrite = NULL;
 
 	// 重置;
 	memset(&m_si, 0, sizeof(m_si));
@@ -1043,12 +1054,11 @@ void CScriptExecutor::StopScript()
 
 bool CScriptExecutor::IsScriptOver()
 {
-	if ( WaitForSingleObject(m_hLogThread, 0) == WAIT_OBJECT_0 )
+	if ( WaitForSingleObject(m_hLogThread, 0) == WAIT_OBJECT_0  && WaitForSingleObject(m_hWorkThread, 0) == WAIT_OBJECT_0)
 	{
-		GLOBAL::WriteTextLog(_T("脚本(%s)已完成"), m_pCaseObj->strCaseName.c_str());
+		GLOBAL::WriteTextLog(_T("====>脚本(%s)已完成"), m_pCaseObj->strCaseName.c_str());
 		return true;
 	}
 
-	GLOBAL::WriteTextLog(_T("脚本(%s)未完成"), m_pCaseObj->strCaseName.c_str());
 	return false;
 }