From 4897210a25e7c98ddacb1fa4ecee3e8bdd1ae98e Mon Sep 17 00:00:00 2001
From: LAPTOP-SNT8I5JK\Boounion <Chenluhua@qq.com>
Date: 星期四, 12 六月 2025 14:18:16 +0800
Subject: [PATCH] 1.手臂选择匹配问题,

---
 SourceCode/Bond/Servo/CMaster.cpp |  373 ++++++++++++++++++++++++++++++++++++++--------------
 1 files changed, 271 insertions(+), 102 deletions(-)

diff --git a/SourceCode/Bond/Servo/CMaster.cpp b/SourceCode/Bond/Servo/CMaster.cpp
index 33a5fc7..4eca70d 100644
--- a/SourceCode/Bond/Servo/CMaster.cpp
+++ b/SourceCode/Bond/Servo/CMaster.cpp
@@ -287,21 +287,31 @@
 
 
 		// 各种机器
+		CEFEM* pEFEM = (CEFEM*)getEquipment(EQ_ID_EFEM);
 		CLoadPort* pLoadPort1 = (CLoadPort*)getEquipment(EQ_ID_LOADPORT1);
 		CLoadPort* pLoadPort2 = (CLoadPort*)getEquipment(EQ_ID_LOADPORT2);
+		CLoadPort* pLoadPort3 = (CLoadPort*)getEquipment(EQ_ID_LOADPORT3);
+		CLoadPort* pLoadPort4 = (CLoadPort*)getEquipment(EQ_ID_LOADPORT4);
 		CFliper* pFliper = (CFliper*)getEquipment(EQ_ID_FLIPER);
-		CVacuumBake* pVacuumBack = (CVacuumBake*)getEquipment(EQ_ID_VACUUMBAKE);
+		CVacuumBake* pVacuumBake = (CVacuumBake*)getEquipment(EQ_ID_VACUUMBAKE);
 		CAligner* pAligner = (CAligner*)getEquipment(EQ_ID_ALIGNER);
 		CBonder* pBonder1 = (CBonder*)getEquipment(EQ_ID_Bonder1);
 		CBonder* pBonder2 = (CBonder*)getEquipment(EQ_ID_Bonder2);
+		CBakeCooling* pBakeCooling = (CBakeCooling*)getEquipment(EQ_ID_BAKE_COOLING);
+		CMeasurement* pMeasurement = (CMeasurement*)getEquipment(EQ_ID_MEASUREMENT);
 
+		ASSERT(pEFEM);
 		ASSERT(pLoadPort1);
 		ASSERT(pLoadPort2);
+		ASSERT(pLoadPort3);
+		ASSERT(pLoadPort4);
 		ASSERT(pFliper);
-		ASSERT(pVacuumBack);
+		ASSERT(pVacuumBake);
 		ASSERT(pAligner);
 		ASSERT(pBonder1);
 		ASSERT(pBonder2);
+		ASSERT(pBakeCooling);
+		ASSERT(pMeasurement);
 
 		while (1) {
 			// 待退出信号或时间到
@@ -365,106 +375,60 @@
 				}
 
 
-
-				// Aligner -> Bonder
-				m_pActiveRobotTask = createTransferTask(pAligner, pBonder1, primaryType, secondaryType);
-				if (m_pActiveRobotTask != nullptr) {
-					std::string strDescription = m_pActiveRobotTask->getDescription();
-					unlock();
-					if (m_listener.onRobotTaskEvent != nullptr) {
-						m_listener.onRobotTaskEvent(this, m_pActiveRobotTask, 0);
-					}
-					LOGI("创建新任务<%s>...", strDescription.c_str());
-					continue;
-				}
-
-				m_pActiveRobotTask = createTransferTask(pAligner, pBonder2, primaryType, secondaryType);
-				if (m_pActiveRobotTask != nullptr) {
-					std::string strDescription = m_pActiveRobotTask->getDescription();
-					unlock();
-					if (m_listener.onRobotTaskEvent != nullptr) {
-						m_listener.onRobotTaskEvent(this, m_pActiveRobotTask, 0);
-					}
-					LOGI("创建新任务<%s>...", strDescription.c_str());
-					continue;
-				}
-
-
-				// Fliper(G2) -> Aligner
-				// VacuumBake(G1) -> Aligner
-				m_pActiveRobotTask = createTransferTask(pFliper, pAligner, primaryType, secondaryType);
-				if (m_pActiveRobotTask != nullptr) {
-					std::string strDescription = m_pActiveRobotTask->getDescription();
-					unlock();
-					if (m_listener.onRobotTaskEvent != nullptr) {
-						m_listener.onRobotTaskEvent(this, m_pActiveRobotTask, 0);
-					}
-					LOGI("创建新任务<%s>...", strDescription.c_str());
-					continue;
-				}
-
-				m_pActiveRobotTask = createTransferTask(pVacuumBack, pAligner, primaryType, secondaryType);
-				if (m_pActiveRobotTask != nullptr) {
-					std::string strDescription = m_pActiveRobotTask->getDescription();
-					unlock();
-					if (m_listener.onRobotTaskEvent != nullptr) {
-						m_listener.onRobotTaskEvent(this, m_pActiveRobotTask, 0);
-					}
-					LOGI("创建新任务<%s>...", strDescription.c_str());
-					continue;
-				}
-
-
-				// LoadPort -> Fliper(G2)
-				// LoadPort -> VacuumBake(G1)
-				CEquipment* pEqTar1 = pVacuumBack;
-				CEquipment* pEqTar2 = pFliper;
+				// Measurement -> LoadPort
+				CLoadPort* pEqLoadPort[] = { pLoadPort1, pLoadPort2, pLoadPort3, pLoadPort4 };
+				CEquipment* pEqTar[] = { pVacuumBake, pFliper };
 				if (primaryType == MaterialsType::G2) {
-					pEqTar1 = pFliper;
-					pEqTar2 = pVacuumBack;
+					pEqTar[0] = pFliper;
+					pEqTar[1] = pVacuumBake;
 				}
-				m_pActiveRobotTask = createTransferTask(pLoadPort1, pEqTar1, primaryType, secondaryType);
-				if (m_pActiveRobotTask != nullptr) {
-					std::string strDescription = m_pActiveRobotTask->getDescription();
-					unlock();
-					if (m_listener.onRobotTaskEvent != nullptr) {
-						m_listener.onRobotTaskEvent(this, m_pActiveRobotTask, 0);
+				for (int s = 0; s < 4; s++) {
+					if (pEqLoadPort[s]->isEnable()
+						&& pEqLoadPort[s]->getPortType() == PortType::Unloading
+						&& pEqLoadPort[s]->getPortMode() == PortMode::ReadyToUnload) {
+						m_pActiveRobotTask = createTransferTask(pMeasurement, pEqLoadPort[s], primaryType, secondaryType);
+						if (m_pActiveRobotTask != nullptr) {
+							goto PORT_PUT;
+						}
 					}
-					LOGI("创建新任务<%s>...", strDescription.c_str());
-					continue;
 				}
 
-				m_pActiveRobotTask = createTransferTask(pLoadPort2, pEqTar1, primaryType, secondaryType);
+			PORT_PUT:
 				if (m_pActiveRobotTask != nullptr) {
+					m_pActiveRobotTask->run();
 					std::string strDescription = m_pActiveRobotTask->getDescription();
 					unlock();
 					if (m_listener.onRobotTaskEvent != nullptr) {
-						m_listener.onRobotTaskEvent(this, m_pActiveRobotTask, 0);
+						m_listener.onRobotTaskEvent(this, m_pActiveRobotTask, ROBOT_EVENT_CREATE);
 					}
 					LOGI("创建新任务<%s>...", strDescription.c_str());
 					continue;
 				}
 
 
-
-				// LoadPort -> VacuumBake(G1)
-				m_pActiveRobotTask = createTransferTask(pLoadPort1, pEqTar2, primaryType, secondaryType);
+				// BakeCooling ->Measurement
+				m_pActiveRobotTask = createTransferTask_bakecooling_to_measurement(pBakeCooling, pMeasurement);
 				if (m_pActiveRobotTask != nullptr) {
+					m_pActiveRobotTask->run();
 					std::string strDescription = m_pActiveRobotTask->getDescription();
 					unlock();
 					if (m_listener.onRobotTaskEvent != nullptr) {
-						m_listener.onRobotTaskEvent(this, m_pActiveRobotTask, 0);
+						m_listener.onRobotTaskEvent(this, m_pActiveRobotTask, ROBOT_EVENT_CREATE);
 					}
 					LOGI("创建新任务<%s>...", strDescription.c_str());
 					continue;
 				}
 
-				m_pActiveRobotTask = createTransferTask(pLoadPort2, pEqTar2, primaryType, secondaryType);
+				
+				// BakeCooling内部
+				// Bake -> Cooling
+				m_pActiveRobotTask = createTransferTask_bake_to_cooling(pBakeCooling);
 				if (m_pActiveRobotTask != nullptr) {
+					m_pActiveRobotTask->run();
 					std::string strDescription = m_pActiveRobotTask->getDescription();
 					unlock();
 					if (m_listener.onRobotTaskEvent != nullptr) {
-						m_listener.onRobotTaskEvent(this, m_pActiveRobotTask, 0);
+						m_listener.onRobotTaskEvent(this, m_pActiveRobotTask, ROBOT_EVENT_CREATE);
 					}
 					LOGI("创建新任务<%s>...", strDescription.c_str());
 					continue;
@@ -472,14 +436,130 @@
 
 
 				// Bonder -> BakeCooling
+				m_pActiveRobotTask = createTransferTask_bonder_to_bakecooling(pBonder1, pBakeCooling);
+				if (m_pActiveRobotTask != nullptr) {
+					m_pActiveRobotTask->run();
+					std::string strDescription = m_pActiveRobotTask->getDescription();
+					unlock();
+					if (m_listener.onRobotTaskEvent != nullptr) {
+						m_listener.onRobotTaskEvent(this, m_pActiveRobotTask, ROBOT_EVENT_CREATE);
+					}
+					LOGI("创建新任务<%s>...", strDescription.c_str());
+					continue;
+				}
+
+				m_pActiveRobotTask = createTransferTask_bonder_to_bakecooling(pBonder2, pBakeCooling);
+				if (m_pActiveRobotTask != nullptr) {
+					m_pActiveRobotTask->run();
+					std::string strDescription = m_pActiveRobotTask->getDescription();
+					unlock();
+					if (m_listener.onRobotTaskEvent != nullptr) {
+						m_listener.onRobotTaskEvent(this, m_pActiveRobotTask, ROBOT_EVENT_CREATE);
+					}
+					LOGI("创建新任务<%s>...", strDescription.c_str());
+					continue;
+				}
+
+				// Fliper(G2) -> Bonder
+				// VacuumBake(G1) -> Bonder
+				m_pActiveRobotTask = createTransferTask(pFliper, pBonder1, primaryType, secondaryType, 2);
+				if (m_pActiveRobotTask != nullptr) {
+					m_pActiveRobotTask->run();
+					std::string strDescription = m_pActiveRobotTask->getDescription();
+					unlock();
+					if (m_listener.onRobotTaskEvent != nullptr) {
+						m_listener.onRobotTaskEvent(this, m_pActiveRobotTask, ROBOT_EVENT_CREATE);
+					}
+					LOGI("创建新任务<%s>...", strDescription.c_str());
+					continue;
+				}
+
+				m_pActiveRobotTask = createTransferTask(pFliper, pBonder2, primaryType, secondaryType, 2);
+				if (m_pActiveRobotTask != nullptr) {
+					m_pActiveRobotTask->run();
+					std::string strDescription = m_pActiveRobotTask->getDescription();
+					unlock();
+					if (m_listener.onRobotTaskEvent != nullptr) {
+						m_listener.onRobotTaskEvent(this, m_pActiveRobotTask, ROBOT_EVENT_CREATE);
+					}
+					LOGI("创建新任务<%s>...", strDescription.c_str());
+					continue;
+				}
+
+				m_pActiveRobotTask = createTransferTask(pVacuumBake, pBonder1, primaryType, secondaryType);
+				if (m_pActiveRobotTask != nullptr) {
+					m_pActiveRobotTask->run();
+					std::string strDescription = m_pActiveRobotTask->getDescription();
+					unlock();
+					if (m_listener.onRobotTaskEvent != nullptr) {
+						m_listener.onRobotTaskEvent(this, m_pActiveRobotTask, ROBOT_EVENT_CREATE);
+					}
+					LOGI("创建新任务<%s>...", strDescription.c_str());
+					continue;
+				}
+
+				m_pActiveRobotTask = createTransferTask(pVacuumBake, pBonder2, primaryType, secondaryType);
+				if (m_pActiveRobotTask != nullptr) {
+					m_pActiveRobotTask->run();
+					std::string strDescription = m_pActiveRobotTask->getDescription();
+					unlock();
+					if (m_listener.onRobotTaskEvent != nullptr) {
+						m_listener.onRobotTaskEvent(this, m_pActiveRobotTask, ROBOT_EVENT_CREATE);
+					}
+					LOGI("创建新任务<%s>...", strDescription.c_str());
+					continue;
+				}
+
+				// Aligner -> Fliper(G2)
+				// Aligner -> VacuumBake(G1)
+				m_pActiveRobotTask = createTransferTask(pAligner, pFliper, primaryType, secondaryType, 2);
+				if (m_pActiveRobotTask != nullptr) {
+					m_pActiveRobotTask->run();
+					std::string strDescription = m_pActiveRobotTask->getDescription();
+					unlock();
+					if (m_listener.onRobotTaskEvent != nullptr) {
+						m_listener.onRobotTaskEvent(this, m_pActiveRobotTask, ROBOT_EVENT_CREATE);
+					}
+					LOGI("创建新任务<%s>...", strDescription.c_str());
+					continue;
+				}
+
+				m_pActiveRobotTask = createTransferTask(pAligner, pVacuumBake, primaryType, secondaryType);
+				if (m_pActiveRobotTask != nullptr) {
+					m_pActiveRobotTask->run();
+					std::string strDescription = m_pActiveRobotTask->getDescription();
+					unlock();
+					if (m_listener.onRobotTaskEvent != nullptr) {
+						m_listener.onRobotTaskEvent(this, m_pActiveRobotTask, ROBOT_EVENT_CREATE);
+					}
+					LOGI("创建新任务<%s>...", strDescription.c_str());
+					continue;
+				}
 
 
-				// BakeCooling ->Measurement
+				// LoadPort -> Aligner
+				for (int s = 0; s < 4; s++) {
+					if (pEqLoadPort[s]->isEnable()
+						&& pEqLoadPort[s]->getPortType() == PortType::Loading
+						&& pEqLoadPort[s]->getPortMode() == PortMode::ReadyToLoad) {
+						m_pActiveRobotTask = createTransferTask(pEqLoadPort[s], pAligner, primaryType, secondaryType);
+						if (m_pActiveRobotTask != nullptr) {
+							goto PORT_GET;
+						}
+					}
+				}
 
-
-				// Measurement -> LoadPort
-
-
+PORT_GET:
+				if (m_pActiveRobotTask != nullptr) {
+					m_pActiveRobotTask->run();
+					std::string strDescription = m_pActiveRobotTask->getDescription();
+					unlock();
+					if (m_listener.onRobotTaskEvent != nullptr) {
+						m_listener.onRobotTaskEvent(this, m_pActiveRobotTask, ROBOT_EVENT_CREATE);
+					}
+					LOGI("创建新任务<%s>...", strDescription.c_str());
+					continue;
+				}
 
 				unlock();
 
@@ -504,6 +584,7 @@
 				break;
 			}
 
+			// 读标志位
 			for (auto item : m_listEquipment) {
 				if (item->getID() == EQ_ID_Bonder1 ||
 					item->getID() == EQ_ID_Bonder2) {
@@ -647,9 +728,8 @@
 
 
 					lock();
-
 					if (m_listener.onRobotTaskEvent != nullptr) {
-						m_listener.onRobotTaskEvent(this, m_pActiveRobotTask, 1);
+						m_listener.onRobotTaskEvent(this, m_pActiveRobotTask, ROBOT_EVENT_FINISH);
 					}
 					delete m_pActiveRobotTask;
 					m_pActiveRobotTask = nullptr;
@@ -921,42 +1001,40 @@
 		CBakeCooling* pBakeCooling = (CBakeCooling*)getEquipment(EQ_ID_BAKE_COOLING);
 		CMeasurement* pMeasurement = (CMeasurement*)getEquipment(EQ_ID_MEASUREMENT);
 
-		nRet = pLoadPort1->getPin("Out1")->connectPin(pFliper->getPin("In1"));
+		nRet = pLoadPort1->getPin("Out")->connectPin(pAligner->getPin("In1"));
 		if (nRet < 0) {
 			LOGE("连接LoadPort1-Fliper失败");
 		}
-		nRet = pLoadPort2->getPin("Out1")->connectPin(pFliper->getPin("In2"));
+		nRet = pLoadPort2->getPin("Out")->connectPin(pAligner->getPin("In2"));
 		if (nRet < 0) {
 			LOGE("连接LoadPort1-Fliper失败");
 		}
 
-		nRet = pLoadPort1->getPin("Out2")->connectPin(pVacuumBake->getPin("In1"));
+		nRet = pAligner->getPin("Out1")->connectPin(pFliper->getPin("In"));
 		if (nRet < 0) {
-			LOGE("连接LoadPort1-VacuumBake失败");
+			LOGE("连接Aligner-Fliper失败");
 		}
-		nRet = pLoadPort2->getPin("Out2")->connectPin(pVacuumBake->getPin("In2"));
+		nRet = pAligner->getPin("Out2")->connectPin(pVacuumBake->getPin("In"));
 		if (nRet < 0) {
-			LOGE("连接LoadPort1-VacuumBake失败");
+			LOGE("连接Aligner-VacuumBake失败");
 		}
 
-		nRet = pFliper->getPin("Out")->connectPin(pAligner->getPin("In1"));
+		nRet = pFliper->getPin("Out1")->connectPin(pBonder1->getPin("In1"));
 		if (nRet < 0) {
-			LOGE("连接Fliper-Aligner失败");
+			LOGE("连接Fliper-Bonder1失败");
+		}
+		nRet = pFliper->getPin("Out2")->connectPin(pBonder2->getPin("In1"));
+		if (nRet < 0) {
+			LOGE("连接Fliper-Bonder2失败");
 		}
 
-		nRet = pVacuumBake->getPin("Out")->connectPin(pAligner->getPin("In2"));
+		nRet = pVacuumBake->getPin("Out1")->connectPin(pBonder1->getPin("In2"));
 		if (nRet < 0) {
-			LOGE("连接VacuumBake-Aligner失败");
+			LOGE("连接VacuumBake-Bonder1失败");
 		}
-
-		nRet = pAligner->getPin("Out1")->connectPin(pBonder1->getPin("In"));
+		nRet = pVacuumBake->getPin("Out2")->connectPin(pBonder2->getPin("In2"));
 		if (nRet < 0) {
-			LOGE("连接Aligner-Bondere1失败");
-		}
-
-		nRet = pAligner->getPin("Out2")->connectPin(pBonder2->getPin("In"));
-		if (nRet < 0) {
-			LOGE("连接Aligner-Bondere2失败");
+			LOGE("连接VacuumBake-Bonder2失败");
 		}
 
 		nRet = pBonder1->getPin("Out")->connectPin(pBakeCooling->getPin("In1"));
@@ -1069,21 +1147,44 @@
 
 	static int taskSeqNo = 0;
 	CRobotTask* CMaster::createTransferTask(CEquipment* pSrcEq, CEquipment* pTarEq,
-		MaterialsType primaryType/* = MaterialsType::G1*/, MaterialsType secondaryType/* = MaterialsType::G2*/)
+		MaterialsType primaryType/* = MaterialsType::G1*/, MaterialsType secondaryType/* = MaterialsType::G2*/,
+		int armNo/* = 1*/)
 	{
 		CRobotTask* pTask = nullptr;
 		CSlot* pSrcSlot, * pTarSlot;
 		pTarSlot = pTarEq->getAvailableSlotForGlass(primaryType);
-		pSrcSlot = pSrcEq->getNonEmptySlot(primaryType);
+		pSrcSlot = pSrcEq->getProcessedSlot(primaryType);
 		if (pSrcSlot == nullptr || nullptr == pTarSlot) {
 			pTarSlot = pTarEq->getAvailableSlotForGlass(secondaryType);
-			pSrcSlot = pSrcEq->getNonEmptySlot(secondaryType);
+			pSrcSlot = pSrcEq->getProcessedSlot(secondaryType);
 		}
 
 
 		if (pSrcSlot != nullptr && nullptr != pTarSlot) {
 			pTask = new CRobotTask();
 			pTask->setContext(pSrcSlot->getContext());
+			pTask->setEFEM((CEFEM*)getEquipment(EQ_ID_EFEM));
+			pTask->setRobotTransferParam(++taskSeqNo, armNo, pSrcSlot->getPosition(),
+				pTarSlot->getPosition(), pSrcSlot->getNo(), pTarSlot->getNo());
+		}
+
+
+		return pTask;
+	}
+
+	CRobotTask* CMaster::createTransferTask_bonder_to_bakecooling(CEquipment* pSrcEq, CEquipment* pTarEq)
+	{
+		std::vector<int> slots = {1, 2};
+
+		CRobotTask* pTask = nullptr;
+		CSlot* pSrcSlot, * pTarSlot;
+		pTarSlot = pTarEq->getAvailableSlotForGlass2(MaterialsType::G1, slots);
+		pSrcSlot = pSrcEq->getProcessedSlot(MaterialsType::G1);
+
+		if (pSrcSlot != nullptr && nullptr != pTarSlot) {
+			pTask = new CRobotTask();
+			pTask->setContext(pSrcSlot->getContext());
+			pTask->setEFEM((CEFEM*)getEquipment(EQ_ID_EFEM));
 			pTask->setRobotTransferParam(++taskSeqNo, 1, pSrcSlot->getPosition(),
 				pTarSlot->getPosition(), pSrcSlot->getNo(), pTarSlot->getNo());
 		}
@@ -1091,4 +1192,72 @@
 
 		return pTask;
 	}
+
+	CRobotTask* CMaster::createTransferTask_bake_to_cooling(CEquipment* pSrcEq)
+	{
+		std::vector<int> slotsTar = { 3, 4 };
+		std::vector<int> slotsSrc = { 1, 2 };
+
+		CRobotTask* pTask = nullptr;
+		CSlot* pSrcSlot, * pTarSlot;
+		pTarSlot = pSrcEq->getAvailableSlotForGlass2(MaterialsType::G1, slotsTar);
+		pSrcSlot = pSrcEq->getProcessedSlot2(MaterialsType::G1, slotsSrc);
+
+		if (pSrcSlot != nullptr && nullptr != pTarSlot) {
+			pTask = new CRobotTask();
+			pTask->setContext(pSrcSlot->getContext());
+			pTask->setEFEM((CEFEM*)getEquipment(EQ_ID_EFEM));
+			pTask->setRobotTransferParam(++taskSeqNo, 1, pSrcSlot->getPosition(),
+				pTarSlot->getPosition(), pSrcSlot->getNo(), pTarSlot->getNo());
+		}
+
+
+		return pTask;
+	}
+
+	CRobotTask* CMaster::createTransferTask_bakecooling_to_measurement(CEquipment* pSrcEq, CEquipment* pTarEq)
+	{
+		std::vector<int> slots = { 3, 4 };
+
+		CRobotTask* pTask = nullptr;
+		CSlot* pSrcSlot, * pTarSlot;
+		pTarSlot = pTarEq->getAvailableSlotForGlass(MaterialsType::G1);
+		pSrcSlot = pSrcEq->getProcessedSlot2(MaterialsType::G1, slots);
+
+		if (pSrcSlot != nullptr && nullptr != pTarSlot) {
+			pTask = new CRobotTask();
+			pTask->setContext(pSrcSlot->getContext());
+			pTask->setEFEM((CEFEM*)getEquipment(EQ_ID_EFEM));
+			pTask->setRobotTransferParam(++taskSeqNo, 1, pSrcSlot->getPosition(),
+				pTarSlot->getPosition(), pSrcSlot->getNo(), pTarSlot->getNo());
+		}
+
+
+		return pTask;
+	}
+
+	int CMaster::abortCurrentTask()
+	{
+		lock();
+		if (m_pActiveRobotTask != nullptr) {
+			m_pActiveRobotTask->abort();
+		}
+		unlock();
+
+		if (m_listener.onRobotTaskEvent != nullptr) {
+			m_listener.onRobotTaskEvent(this, m_pActiveRobotTask, ROBOT_EVENT_ABORT);
+		}
+
+		lock();
+		if (m_pActiveRobotTask != nullptr) {
+			delete m_pActiveRobotTask;
+			m_pActiveRobotTask = nullptr;
+		}
+		unlock();
+
+		// 当前任务手动中止后,停止调度,需要操作员在解决问题后,重新启动
+		stop();
+
+		return 0;
+	}
 }

--
Gitblit v1.9.3