中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++怎么實現一個有限狀態機

發布時間:2021-08-30 16:22:40 來源:億速云 閱讀:294 作者:chen 欄目:編程語言

本篇內容介紹了“C++怎么實現一個有限狀態機”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!


什么是有限狀態機?

簡單說就是作一件事可能會經過多個不同狀態的轉換, 轉換依賴于在不同時間發生的不同事件來觸發, 舉個例子,比如 TCP的狀態轉換圖, 在實現上就可以用FSM.

C++怎么實現一個有限狀態機

傳統的實現方案

if...else : 搞一大堆if else, 一個函數寫很長很長......

swich...case : 也搞一大堆一個函數寫很長很長......

FSM的實現方案

根據具體的業務需要, 將業務的處理流程定義為一個狀態機, 此狀態機中存在以下必要元素

  1. 根據業務需要, 拆解抽象出若干個不同狀態 State, 并確定此狀態機的初始狀態;

  2. 根據實現需要, 抽象出用于觸發狀態轉換的事件 Event;

  3. 為了處理一個Event, 需要定義狀態的轉換過程Transition;

  4. 狀態機要先判斷當前所處的狀態是否與當前發生的Event匹配(注意: 相同的狀態可能同時匹配多個Event)。

用張簡圖來說明一下

C++怎么實現一個有限狀態機


  1. MachineSet可以同時管理多個Machine;

  2. 外部觸發的Event進入到MachineSet的事件隊列;

  3. 事件隊列里的Event被順序處理, 被Dispatch到match的Machine;

  4. Machine根據當前的所處的state和Event類型來判斷當前Event是否有效;

  5. 如果上面(4)中的Event有效, 則進行狀態轉換;

  6. 狀態轉換具體來說涉及到三個回調函數:


            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的處理, 提供兩種方案:

  1. 直接使用MachineSet提供的StartBackground, 開啟一個work thread, 在這個work thread中不斷從存儲event的fifo隊列中獲取event后dispatch到各個machine;

  2. 不使用MachineSet提供的event fifo, 實現自己的MachineSetHandler, 將其實例注冊到MachineSet, 從event的派發;

一個具體的實現

我們來使用上面的FSM的實現來模擬一個用戶登陸的場景;

定義用到的Event和幾種不同的事件類型

C++怎么實現一個有限狀態機

定義用到的狀態機, 從 kuafu::StateMachine 繼承, 其中包括用過的幾種state和transitionC++怎么實現一個有限狀態機

在Birth()函數中構造 state和 transition, Birth()是StateMachine的一個虛函數, 每個用戶實現的Machine都需要實現它:

C++怎么實現一個有限狀態機

創建MachineSet, 并開始event處理線程

C++怎么實現一個有限狀態機

創建用戶定義的Machine, 設置初始狀態

C++怎么實現一個有限狀態機

設置state和transition相應的回調

C++怎么實現一個有限狀態機

模擬event發生:

C++怎么實現一個有限狀態機


“C++怎么實現一個有限狀態機”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

c++
AI

富蕴县| 阿合奇县| 吕梁市| 武义县| 敖汉旗| 西贡区| 德格县| 保德县| 门源| 哈密市| 渑池县| 西乡县| 新泰市| 营山县| 木里| 搜索| 泰来县| 浦城县| 丹江口市| 文山县| 通渭县| 玉田县| 沂南县| 定安县| 四会市| 汝阳县| 阳新县| 岳西县| 新巴尔虎右旗| 乐平市| 长治县| 新河县| 化州市| 城市| 石屏县| 兰西县| 山阳县| 安国市| 钟祥市| 冕宁县| 岫岩|