From b48dbe316b557f9cd0698cfbb4a4230cb4685a98 Mon Sep 17 00:00:00 2001
From: chenluhua1980 <Chenluhua@qq.com>
Date: 星期四, 12 二月 2026 16:52:39 +0800
Subject: [PATCH] 1.ProcessStart后,停止再启动软件,不能创建调度任务,需要重启软件。修复:启动时复位千传相关变是。注:待测试验证。

---
 SourceCode/Bond/Servo/CMaster.cpp |   80 ++++++++++++++++++++++++++++++++++++++++
 1 files changed, 80 insertions(+), 0 deletions(-)

diff --git a/SourceCode/Bond/Servo/CMaster.cpp b/SourceCode/Bond/Servo/CMaster.cpp
index 62a6733..0252eaa 100644
--- a/SourceCode/Bond/Servo/CMaster.cpp
+++ b/SourceCode/Bond/Servo/CMaster.cpp
@@ -372,6 +372,20 @@
 			return -1;
 		}
 
+		lock();
+		// Ensure stale transfer state does not leak across runs.
+		m_nContinuousTransferStep = CTStep_Unknow;
+		m_nContinuousWorkingPort = 0;
+		m_nContinuousWorkingSlot = 0;
+		if (m_pActiveRobotTask != nullptr) {
+			LOGW("<Master>start: stale active robot task found in READY, clearing it.");
+			delete m_pActiveRobotTask;
+			m_pActiveRobotTask = nullptr;
+		}
+		unlock();
+		LOGI("<Master>start reset transfer state(step=%d, port=%d, slot=%d).",
+			m_nContinuousTransferStep, m_nContinuousWorkingPort, m_nContinuousWorkingSlot);
+
 		m_bContinuousTransfer = false;
 		m_bBatch = false;
 		setState(MASTERSTATE::STARTING);
@@ -386,6 +400,20 @@
 			return -1;
 		}
 
+		lock();
+		// Continuous transfer must start from a clean state every time.
+		m_nContinuousTransferStep = CTStep_Unknow;
+		m_nContinuousWorkingPort = 0;
+		m_nContinuousWorkingSlot = 0;
+		if (m_pActiveRobotTask != nullptr) {
+			LOGW("<Master>startContinuousTransfer: stale active robot task found in READY, clearing it.");
+			delete m_pActiveRobotTask;
+			m_pActiveRobotTask = nullptr;
+		}
+		unlock();
+		LOGI("<Master>startContinuousTransfer reset transfer state(step=%d, port=%d, slot=%d).",
+			m_nContinuousTransferStep, m_nContinuousWorkingPort, m_nContinuousWorkingSlot);
+
 		m_bContinuousTransfer = true;
 		m_bBatch = false;
 		setState(MASTERSTATE::STARTING);
@@ -399,6 +427,20 @@
 		if (m_state != MASTERSTATE::READY) {
 			return -1;
 		}
+
+		lock();
+		// Keep behavior consistent with other start paths.
+		m_nContinuousTransferStep = CTStep_Unknow;
+		m_nContinuousWorkingPort = 0;
+		m_nContinuousWorkingSlot = 0;
+		if (m_pActiveRobotTask != nullptr) {
+			LOGW("<Master>startBatch: stale active robot task found in READY, clearing it.");
+			delete m_pActiveRobotTask;
+			m_pActiveRobotTask = nullptr;
+		}
+		unlock();
+		LOGI("<Master>startBatch reset transfer state(step=%d, port=%d, slot=%d).",
+			m_nContinuousTransferStep, m_nContinuousWorkingPort, m_nContinuousWorkingSlot);
 
 		m_bContinuousTransfer = false;
 		m_bBatch = true;
@@ -3769,6 +3811,33 @@
 		}
 		m_pControlJob->setPJs(tempPjs);
 
+		// 閲嶅缓杩愯鎬佺紦瀛橈紝閬垮厤閲嶅惎鍚庝粎渚濊禆 Queued 閫夋嫨瀵艰嚧鎵句笉鍒板綋鍓� PJ銆�
+		m_inProcesJobs.clear();
+		m_completeProcessJobs.clear();
+		m_queueGlasses.clear();
+		m_inProcesGlasses.clear();
+		m_completeGlasses.clear();
+		for (auto pj : tempPjs) {
+			if (pj == nullptr) continue;
+			switch (pj->state()) {
+			case PJState::InProcess:
+			case PJState::Paused:
+				m_inProcesJobs.push_back(pj);
+				break;
+			case PJState::Completed:
+			case PJState::Aborted:
+			case PJState::Failed:
+				m_completeProcessJobs.push_back(pj);
+				break;
+			default:
+				break;
+			}
+		}
+		LOGI("<Master>loadState: ProcessJob rebuild done. total=%d, inProcess=%d, complete=%d",
+			(int)tempPjs.size(),
+			(int)m_inProcesJobs.size(),
+			(int)m_completeProcessJobs.size());
+
 
 		// 鏇存柊contexts
 		auto pjs = m_pControlJob->getPjs();
@@ -3801,14 +3870,25 @@
 
 	CProcessJob* CMaster::acquireNextProcessJob()
 	{
+		if (m_pControlJob == nullptr) return nullptr;
 		auto& pjs = m_pControlJob->getPjs();
 		for (const auto pj : pjs) {
 			if (pj->state() == PJState::Queued) {
+				LOGI("<Master>acquireNextProcessJob: start queued PJ(%s)", pj->id().c_str());
 				pj->start();
 				return pj;
 			}
 		}
 
+		// 鑻ユ病鏈� Queued锛岀户缁鐢ㄥ凡缁忓湪鍒�/鏆傚仠鐨� PJ锛堜緥濡� loadState 鎭㈠鍚庣殑鍦烘櫙锛夈��
+		for (const auto pj : pjs) {
+			if (pj->state() == PJState::InProcess || pj->state() == PJState::Paused) {
+				LOGI("<Master>acquireNextProcessJob: reuse PJ(%s), state=%d",
+					pj->id().c_str(), (int)pj->state());
+				return pj;
+			}
+		}
+
 
 		return nullptr;
 	}

--
Gitblit v1.9.3