Forráskód Böngészése

补充:任务被中止时,SATService不中止正在运行的任务;
注意:结束CPythonExecutor对象时,先停止日志线程,再停止脚本线程;而且,不能直接delete对象,而是先EndofThread后再delete,否则析构函数会提前删除其他成员变量内容;

scbc.sat2 5 éve
szülő
commit
e661ea931f

+ 6 - 2
SATService/SATService/PythonExecutor.cpp

@@ -39,8 +39,8 @@ CPythonExecutor::CPythonExecutor(void)
 
 CPythonExecutor::~CPythonExecutor(void)
 {
-	EndWorkThread();
 	EndLogThread();
+	EndWorkThread();	
 }
 
 DWORD CPythonExecutor::_WorkerThread(LPVOID lpParam)
@@ -432,6 +432,8 @@ void CPythonExecutor::EndLogThread()
 {
 	// 标记结束;
 	m_bStopLogExport = TRUE;
+	// 同时关闭重定向的句柄;
+	EndSubprocessStdOut();
 	// 等待5秒,是否能自主结束线程;
 	if ( m_hStdoutLogThread ) {
 		if ( WaitForSingleObject(m_hStdoutLogThread, 5000) == WAIT_OBJECT_0 ) {
@@ -479,8 +481,10 @@ void CPythonExecutor::EndLogThread()
 
 void CPythonExecutor::EndThread()
 {
-	EndWorkThread();
+	// 先关闭日志线程;
 	EndLogThread();
+	// 再关闭脚本线程;
+	EndWorkThread();
 }
 
 BOOL CPythonExecutor::EndSubprocess()

+ 28 - 9
SATService/SATService/SATExecutor.cpp

@@ -22,8 +22,13 @@ bool CSATExecutor::IsTaskExist(SATHTTP::STTask &task)
 	bool found = false;
 	std::list<SATHTTP::STTask>::iterator it = m_vtTask.begin();
 	for ( ; it != m_vtTask.end(); it++ ) {
-		// 不要使用nTaskId,这个值没啥用;
-		if ( it->Id == task.Id ) {
+		// 不要使用nTaskId,这个值没啥用;//不要使用Id这个值,如果任务被停止会变更;
+		if ( it->nInstanceId == task.nInstanceId ) {
+			// 如果被中止,并变更状态为已执行;
+			if ( _tcsicmp(task.strTaskType.c_str(), "3") == 0 ) {
+				it->_nExecutionState = SATHTTP::EXECUTED;
+				it->_nExecutionResult = SATHTTP::FAIL;
+			}
 			found = true;
 			break;
 		}
@@ -65,14 +70,23 @@ void CSATExecutor::DelFinishedTask()
 	for ( ; it != m_vtTask.end(); it++ ) {
 		// 状态为2的完成任务;
 		if ( it->_nExecutionState == SATHTTP::EXECUTED ) {
-			GLOBAL::WriteTextLog("\n<===============================================>\nend.删除已完成任务:%s\n<===============================================>\n", it->Job.strUniqueId.c_str());
 			// 删除所有执行器对象;
+			CPythonExecutor *pExecutor = NULL;
 			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;
+				pExecutor = (CPythonExecutor *)_case->_pExcutor;
+				if ( pExecutor ) {	
+					// 结束所有工作线程;
+					pExecutor->EndThread();
+					// 释放内存;
+					delete pExecutor;
+					pExecutor = NULL;
+				}				
 			}
+			// 删除任务前,变更设备状态为空闲;
+			SetDeviceStatus(it->Job.strDeviceId, SATDEV::Idle);
+			// 删除任务;
 			m_vtTask.erase(it);
+			GLOBAL::WriteTextLog("\n<===============================================>\nend.删除已完成任务:%s\n<===============================================>\n", it->Job.strUniqueId.c_str());
 			break;
 		}
 	}
@@ -159,7 +173,7 @@ void CSATExecutor::AddDevices(const SATDEV::STDevice &stDevice)
 	if ( stDevice.nStatus == SATDEV::Idle )
 		http_dev.strStatus = "0";
 	else if ( stDevice.nStatus == SATDEV::InUse )
-		http_dev.strStatus = "1";
+		http_dev.strStatus = "2";	// 注意避坑:0表示连接,即设备空闲;1表示设备断开;2表示设备繁忙
 	// 设备序列号;
 	http_dev.strDeviceSerial = stDevice.strName;
 	// 余下变量固定值;
@@ -193,7 +207,7 @@ void CSATExecutor::DelDevices(const SATDEV::STDevice &stDevice)
 	}
 }
 
-void CSATExecutor::SynchDeviceStatus(std::string strDevName, SATDEV::DEVICE_USAGE_STATUS status)
+void CSATExecutor::SetDeviceStatus(std::string strDevName, SATDEV::DEVICE_USAGE_STATUS status)
 {
 	std::vector<SATHTTP::STDevice>::iterator it = m_vtDevice.begin();
 	for ( ; it != m_vtDevice.end(); it++ ) {
@@ -201,11 +215,12 @@ void CSATExecutor::SynchDeviceStatus(std::string strDevName, SATDEV::DEVICE_USAG
 			if ( status == SATDEV::Idle )
 				it->strStatus = "0";
 			else if ( status == SATDEV::InUse )
-				it->strStatus = "1";
+				it->strStatus = "2";	// 注意避坑:0表示连接,即设备空闲;1表示设备断开;2表示设备繁忙
 			break;
 		}
 	}
 
+	// 同时,同步SATDevices的设备状态;
 	CSATDevices::SetDeviceUsageStatus(strDevName, status);
 }
 
@@ -223,6 +238,7 @@ bool CSATExecutor::IsDeviceExist(std::string strDevName)
 	return bExist;
 }
 
+
 bool CSATExecutor::Login(std::string user, std::string password, std::string actuator, bool bLogin /*= true*/)
 {
 	std::string url = GLOBAL::g_stSATConfig.szExecuteServer;
@@ -1212,6 +1228,9 @@ DWORD CSATExecutor::ExecuteScriptThread(LPVOID lpVoid)
 
 				// 通知SAT服务器,脚本开始;
 				that->ReportTaskStart(pTask);
+
+				// 将设备变更成繁忙状态;
+				that->SetDeviceStatus(pTask->Job.strDeviceId, SATDEV::InUse);
 			}	
 		}
 	} while ( WaitForSingleObject(that->m_hEventExcuteScript, 10000) == WAIT_TIMEOUT );

+ 2 - 2
SATService/SATService/SATExecutor.h

@@ -76,8 +76,8 @@ public:
 	void AddDevices(const SATDEV::STDevice &stDevice);
 	// 删除设备;
 	void DelDevices(const SATDEV::STDevice &stDevice);
-	// 同步设备状态;
-	void SynchDeviceStatus(std::string strDevName, SATDEV::DEVICE_USAGE_STATUS status);
+	// 设置设备为状态;
+	void SetDeviceStatus(std::string strDevName, SATDEV::DEVICE_USAGE_STATUS status);
 	// 设备是否存在;
 	bool IsDeviceExist(std::string strDevName);