Browse Source

1、修复SATDevice的一个BUG.
2、SATExecutor冒烟任务处理。

scbc 5 years ago
parent
commit
ac8ad96681

+ 6 - 1
SATService/SATService/SATDevices.cpp

@@ -56,6 +56,8 @@ std::string ExecuteCMD(std::string cmd)
 	{
 		CloseHandle(hRead);
 		CloseHandle(hWrite);
+
+		hWrite = hRead = NULL;
 	}
 
 	// 等待进程结束;
@@ -64,7 +66,10 @@ std::string ExecuteCMD(std::string cmd)
 	// 释放所有句柄;
 	CloseHandle(pi.hProcess);
 	CloseHandle(pi.hThread);
-	CloseHandle(hWrite);
+	if ( hWrite ) {
+		CloseHandle(hWrite);
+		hWrite = NULL;
+	}
 
 	// 等待缓冲写入;
 	Sleep(200);

+ 36 - 39
SATService/SATService/SATExecutor.cpp

@@ -44,6 +44,7 @@ CSATExecutor::CSATExecutor(void)
 	m_hThreadHearbeat = NULL;
 	m_hEventExcuteScript = NULL;
 	m_hThreadExcuteScript = NULL;
+	m_dwSomkingThreadId = 0;
 }
 
 CSATExecutor::~CSATExecutor(void)
@@ -55,10 +56,11 @@ CSATExecutor::~CSATExecutor(void)
 bool CSATExecutor::IsTaskExist(SATHTTP::STTask &task)
 {
 	// 若是冒烟任务;
-	if ( task.taskInfo.strTaskType == "STANDARDAPKCOMPAT" ) {
+	task.taskInfo.strTaskType = "冒烟任务";
+	if ( task.taskInfo.strTaskType == "冒烟任务" ) {
 		AutoThreadSection ats(&m_csSomkingTask);
 		// 如果任务存在,删除原来的;
-		std::list<SATHTTP::STTask>::iterator it = m_vtSmokingTask.begin();
+		std::vector<SATHTTP::STTask>::iterator it = m_vtSmokingTask.begin();
 		for ( ; it != m_vtSmokingTask.end(); it++ ) {
 			// 不要使用nTaskId,这个值没啥用;//不要使用Id这个值,如果任务被停止会变更;
 			if ( it->taskInfo.nInstanceId == task.taskInfo.nInstanceId ) {
@@ -331,17 +333,14 @@ void CSATExecutor::TaskRoundSetting(SATHTTP::STTask* pTask)
 	pTask->_roundSize = pTask->vtCases.size();
 	// 获取执行轮数;
 	pTask->_roundCount = _tstol(pTask->Job.strRound.c_str());
-	if ( pTask->_roundCount > 1 )
-	{
+	if ( pTask->_roundCount > 1 ) {
 		TCHAR szValue[8] = { 0 }; 
 		// 复制一份出来,修改round值,再添加给任务;
 		std::vector<SATHTTP::STCase> vtOrgCase = pTask->vtCases;
-		for ( int i = 2; i <= pTask->_roundCount; i++ )
-		{
+		for ( int i = 2; i <= pTask->_roundCount; i++ ) {
 			_itoa_s(i, szValue, 10);
 			std::vector<SATHTTP::STCase> vtCase = vtOrgCase;
-			for ( std::vector<SATHTTP::STCase>::iterator it = vtCase.begin(); it != vtCase.end(); it++ )
-			{				
+			for ( std::vector<SATHTTP::STCase>::iterator it = vtCase.begin(); it != vtCase.end(); it++ ) {				
 				it->_strRoundNum = szValue;
 				pTask->vtCases.push_back(*it);
 			}			
@@ -1211,19 +1210,14 @@ int CSATExecutor::AttachTaskInfo2Buffer(SATPROTO::TaskInfo (&pbuff)[SATPROTO::MA
 	return count;
 }
 
-void CSATExecutor::SmokeTaskPretreated(std::list<SATHTTP::STTask>::iterator &it)
+bool CSATExecutor::SmokeTaskPretreated(SATHTTP::STTask &task)
 {
-	if ( it == m_vtSmokingTask.end() )
-		return;
-
 #ifdef _DEBUG
-	SATHTTP::STTask *pTask = (SATHTTP::STTask*)&*it;
-
 	//pTask->taskInfo.strSomkingCycle = _T("{ \"type\" : 0, \"day\" : 0, \"week\" : 0, \"time\" : \"20:30\" } ");
-	pTask->taskInfo.stSomkingCycle.nType = 1;
-	pTask->taskInfo.stSomkingCycle.nWeek = 0;
-	pTask->taskInfo.stSomkingCycle.nDay = 0;
-	pTask->taskInfo.stSomkingCycle.strTime = "16:05";
+	task.taskInfo.stSomkingCycle.nType = 1;
+	task.taskInfo.stSomkingCycle.nWeek = 0;
+	task.taskInfo.stSomkingCycle.nDay = 0;
+	task.taskInfo.stSomkingCycle.strTime = "16:20";
 
 	bool bTimeIsUp = false;
 	// 获取当前日历时间(1900-01-01开始的Unix时间戳);
@@ -1234,32 +1228,32 @@ void CSATExecutor::SmokeTaskPretreated(std::list<SATHTTP::STTask>::iterator &it)
 
 	// 获取执行时间;
 	int hour, minute;
-	sscanf_s(pTask->taskInfo.stSomkingCycle.strTime.c_str(), _T("%d:%d"), &hour, &minute);
+	sscanf_s(task.taskInfo.stSomkingCycle.strTime.c_str(), _T("%d:%d"), &hour, &minute);
 	// 是否到达指定时间;
-	if ( pTask->taskInfo.stSomkingCycle.nType == 0 ) {// 立即;
+	if ( task.taskInfo.stSomkingCycle.nType == 0 ) {// 立即;
 		bTimeIsUp = true;
 	}
-	else if ( pTask->taskInfo.stSomkingCycle.nType == 1 ) {// 每天;
+	else if ( task.taskInfo.stSomkingCycle.nType == 1 ) {// 每天;
 		if ( gmtm.tm_hour == hour && gmtm.tm_min >= minute )
 			bTimeIsUp = true;
 	}
-	else if ( pTask->taskInfo.stSomkingCycle.nType == 2 ) {// 每周;
-		if ( gmtm.tm_wday == pTask->taskInfo.stSomkingCycle.nWeek && gmtm.tm_hour == hour && gmtm.tm_min >= minute )
+	else if ( task.taskInfo.stSomkingCycle.nType == 2 ) {// 每周;
+		if ( gmtm.tm_wday == task.taskInfo.stSomkingCycle.nWeek && gmtm.tm_hour == hour && gmtm.tm_min >= minute )
 			bTimeIsUp = true;
 	}
-	else if ( pTask->taskInfo.stSomkingCycle.nType == 3 ) {// 每月;
-		if ( gmtm.tm_mday == pTask->taskInfo.stSomkingCycle.nDay && 
-			gmtm.tm_wday == pTask->taskInfo.stSomkingCycle.nWeek && gmtm.tm_hour == hour && gmtm.tm_min >= minute )
+	else if ( task.taskInfo.stSomkingCycle.nType == 3 ) {// 每月;
+		if ( gmtm.tm_mday == task.taskInfo.stSomkingCycle.nDay && 
+			gmtm.tm_wday == task.taskInfo.stSomkingCycle.nWeek && gmtm.tm_hour == hour && gmtm.tm_min >= minute )
 			bTimeIsUp = true;
 	}
 
 	// 到达执行时间;
 	if ( bTimeIsUp ) {
 		// 下载任务,并添加到队列中;
-		DownloadTask(*pTask);
-		// 移除;
-		it = m_vtSmokingTask.erase(it);
+		DownloadTask(task);
 	}
+
+	return bTimeIsUp;
 #endif
 }
 
@@ -1294,7 +1288,7 @@ void CSATExecutor::StartWork()
 		goto clear;
 	}
 
-	m_hThreadSomkingScript = CreateThread(NULL, 0, SomkingScriptThread, this, 0, NULL);
+	m_hThreadSomkingScript = CreateThread(NULL, 0, SomkingScriptThread, this, 0, &m_dwSomkingThreadId);
 	if ( m_hThreadSomkingScript == NULL ) {
 		goto clear;
 	}
@@ -1742,21 +1736,24 @@ DWORD CSATExecutor::SomkingScriptThread(LPVOID lpVoid)
 	CSATExecutor *that = (CSATExecutor*)lpVoid;
 	if ( !that ) return 0;
 	
+	int nIndex = 0;
 	// 如果任务存在,删除原来的;
-	std::list<SATHTTP::STTask>::iterator it = that->m_vtSmokingTask.end();
-
+	SATHTTP::STTask task;
 	do 
 	{
 		AutoThreadSection ats(&that->m_csSomkingTask);
-		if ( that->m_vtSmokingTask.size() == 0 )
+		if ( that->m_vtSmokingTask.size() == 0 ) {
 			continue;
+		}
 
-		if ( it == that->m_vtSmokingTask.end() )
-			it = that->m_vtSmokingTask.begin();
-		else 
-			it++;
-		
-		that->SmokeTaskPretreated(it);
+		if ( nIndex >= that->m_vtSmokingTask.size() )
+			nIndex = 0;
+
+		task = that->m_vtSmokingTask[nIndex];
+		if ( that->SmokeTaskPretreated(task) )
+			that->m_vtSmokingTask.erase(that->m_vtSmokingTask.begin()+nIndex);
+		else
+			nIndex++;
 		
 	} while (WaitForSingleObject(that->m_hEventSomkingScript, 15000) == WAIT_TIMEOUT);
 

+ 3 - 2
SATService/SATService/SATExecutor.h

@@ -55,6 +55,7 @@ protected:
 	// 执行线程句柄;
 	HANDLE	m_hThreadExcuteScript;
 	// 冒烟任务;
+	DWORD	m_dwSomkingThreadId;
 	HANDLE  m_hEventSomkingScript;
 	HANDLE	m_hThreadSomkingScript;
 
@@ -66,7 +67,7 @@ protected:
 	ThreadSection					m_csTask;
 	ThreadSection					m_csSomkingTask;
 	std::list<SATHTTP::STTask>		m_vtTask;
-	std::list<SATHTTP::STTask>		m_vtSmokingTask;
+	std::vector<SATHTTP::STTask>	m_vtSmokingTask;
 	std::vector<SATHTTP::STDevice>	m_vtDevice;
 	SATHTTP::STLoginReq				m_stLoginReq;
 	SATHTTP::STLoginResp			m_stLoginResp;
@@ -136,7 +137,7 @@ public:
 	// 将任务列表附加到缓存中;
 	int AttachTaskInfo2Buffer(SATPROTO::TaskInfo (&pbuff)[SATPROTO::MAX_TASKS]);
 	// 冒烟测试任务处理(如果任务是冒烟测试类型,进行预处理);
-	void SmokeTaskPretreated(std::list<SATHTTP::STTask>::iterator &it);
+	bool SmokeTaskPretreated(SATHTTP::STTask &task);
 
 	// 其他接口;
 public: