您好,登錄后才能下訂單哦!
本篇內容介紹了“C++怎么實現一個有限狀態機”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
什么是有限狀態機?
簡單說就是作一件事可能會經過多個不同狀態的轉換, 轉換依賴于在不同時間發生的不同事件來觸發, 舉個例子,比如 TCP的狀態轉換圖, 在實現上就可以用FSM.
傳統的實現方案
if...else : 搞一大堆if else, 一個函數寫很長很長......
swich...case : 也搞一大堆一個函數寫很長很長......
FSM的實現方案
根據具體的業務需要, 將業務的處理流程定義為一個狀態機, 此狀態機中存在以下必要元素
根據業務需要, 拆解抽象出若干個不同狀態 State, 并確定此狀態機的初始狀態;
根據實現需要, 抽象出用于觸發狀態轉換的事件 Event;
為了處理一個Event, 需要定義狀態的轉換過程Transition;
狀態機要先判斷當前所處的狀態是否與當前發生的Event匹配(注意: 相同的狀態可能同時匹配多個Event)。
用張簡圖來說明一下
MachineSet可以同時管理多個Machine;
外部觸發的Event進入到MachineSet的事件隊列;
事件隊列里的Event被順序處理, 被Dispatch到match的Machine;
Machine根據當前的所處的state和Event類型來判斷當前Event是否有效;
如果上面(4)中的Event有效, 則進行狀態轉換;
狀態轉換具體來說涉及到三個回調函數:
6.1 當前state離開, 是第一個回調,需要使用者根據實際需要處理;
6.2 trasition這個轉換過程, 是第二個回調;
6.3 新state的進入, 是第三個回調;
一個簡單的狀態機,差不多就是上面這些內容, 剩下的就是用程序語言把它實現出來了;
FSM的C++ 實現
一個用C++11實現的FSM的代碼
https://github.com/DavidLiuXh/kuafu
實現簡介:
主要就是按deamo里的思路, 封裝了以下幾個模塊
MachineSet,
Machine,
Event,
Transition,
Predicate
對于Event的處理, 提供兩種方案:
直接使用MachineSet提供的StartBackground, 開啟一個work thread, 在這個work thread中不斷從存儲event的fifo隊列中獲取event后dispatch到各個machine;
不使用MachineSet提供的event fifo, 實現自己的MachineSetHandler, 將其實例注冊到MachineSet, 從event的派發;
一個具體的實現
我們來使用上面的FSM的實現來模擬一個用戶登陸的場景;
定義用到的Event和幾種不同的事件類型
定義用到的狀態機, 從 kuafu::StateMachine 繼承, 其中包括用過的幾種state和transition
在Birth()函數中構造 state和 transition, Birth()是StateMachine的一個虛函數, 每個用戶實現的Machine都需要實現它:
創建MachineSet, 并開始event處理線程
創建用戶定義的Machine, 設置初始狀態
設置state和transition相應的回調
模擬event發生:
“C++怎么實現一個有限狀態機”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。