浏览代码

Z991239-6196 #comment 状态机未完成初始化前不接受事件的处理,以解决实体Lost问题

80374374 5 月之前
父节点
当前提交
cb5f83e712
共有 2 个文件被更改,包括 26 次插入5 次删除
  1. 11 2
      Framework/Common/SpFSM.h
  2. 15 3
      Framework/spbase/SpFSM.cpp

+ 11 - 2
Framework/Common/SpFSM.h

@@ -35,7 +35,7 @@ enum FSMEventEnum
 
 #define FSM_STATE_INIT -1 // the initial state of the FSM
 #define FSM_STATE_EXIT -2 // the exit state of the FSM
-
+#define FSM_STATE_ERROR -3 // the error state of the FSM
 struct FSMEvent
 {
 	int iEvt;
@@ -124,6 +124,12 @@ public:
 	virtual int MatchRule(int state, int evt, unsigned int rc)=0;
 	virtual BOOL FindStateEvent(int evt)=0;
 
+protected:
+	const bool InNotInitState() const
+	{
+		return (m_iState == FSM_STATE_INIT || m_iState == FSM_STATE_EXIT || m_iState == FSM_STATE_ERROR);
+	}
+
 private:
 	void Trans(int next);
 
@@ -229,7 +235,10 @@ public:
 			return "State_Start";
 		} else if (iState == FSM_STATE_EXIT) {
 			return "State_End";
-		} else {
+		} else if (iState == FSM_STATE_ERROR) {
+			return "State_Error";
+		}
+		else {
 			T *pT = static_cast<T*>(this);
 #ifdef _WIN32
 			T::FSMStateEntry* entry = pT->GetState(iState);

+ 15 - 3
Framework/spbase/SpFSM.cpp

@@ -116,7 +116,9 @@ ErrorCodeEnum FSMBase::Init(CEntityBase *pEntity)
 	if (Error == Error_Succeed) {
 		Trans(GetInitState());
 	}
-
+	else {
+		//m_iState = FSM_STATE_ERROR;
+	}
 	return Error;
 }
 
@@ -183,7 +185,7 @@ void FSMBase::__ProcessEvent(FSMEvent *e)
 		if (old_state != new_state) {
 			OnHook(old_state, new_state); // dont change state here
 			TOOLKIT_ASSERT(m_iState == old_state);
-			if (old_state != FSM_STATE_INIT) {
+			if (old_state != FSM_STATE_INIT && old_state != FSM_STATE_ERROR) {
 				OnStateExit(old_state);
 			}
 			m_iState = new_state;
@@ -217,7 +219,7 @@ void FSMBase::__ProcessEvent(FSMEvent *e)
 		if (m_lInTrans) {
 			e->IncRef();
 			ListEntry_AddTail(&m_eventlist, &e->m_entry);
-		} else {
+		} else if(!InNotInitState()){
 			unsigned int rc = OnStateEvent(e);
 			if (!e->IsHandled()) {
 				if (FindStateEvent(e->iEvt)) {
@@ -234,6 +236,16 @@ void FSMBase::__ProcessEvent(FSMEvent *e)
 			}
 			e->SetHandled(FALSE);
 		}
+		else {
+			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Ignore the FSMEvent id: %d", e->iEvt);
+			if (e->IsHandled()) {
+				/**   [Gifur@2025429]*/
+			}
+			else {
+				e->OnUnhandled();
+			}
+			e->SetHandled(FALSE);
+		}
 	}
 }