真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

C++怎么實現(xiàn)一個有限狀態(tài)機

本篇內(nèi)容介紹了“C++怎么實現(xiàn)一個有限狀態(tài)機”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細閱讀,能夠?qū)W有所成!

創(chuàng)新互聯(lián)一直通過網(wǎng)站建設(shè)和網(wǎng)站營銷幫助企業(yè)獲得更多客戶資源。 以"深度挖掘,量身打造,注重實效"的一站式服務(wù),以做網(wǎng)站、成都網(wǎng)站設(shè)計、移動互聯(lián)產(chǎn)品、成都營銷網(wǎng)站建設(shè)服務(wù)為核心業(yè)務(wù)。十余年網(wǎng)站制作的經(jīng)驗,使用新網(wǎng)站建設(shè)技術(shù),全新開發(fā)出的標準網(wǎng)站,不但價格便宜而且實用、靈活,特別適合中小公司網(wǎng)站制作。網(wǎng)站管理系統(tǒng)簡單易用,維護方便,您可以完全操作網(wǎng)站資料,是中小公司快速網(wǎng)站建設(shè)的選擇。

什么是有限狀態(tài)機?

簡單說就是作一件事可能會經(jīng)過多個不同狀態(tài)的轉(zhuǎn)換, 轉(zhuǎn)換依賴于在不同時間發(fā)生的不同事件來觸發(fā), 舉個例子,比如 TCP的狀態(tài)轉(zhuǎn)換圖, 在實現(xiàn)上就可以用FSM.

C++怎么實現(xiàn)一個有限狀態(tài)機

傳統(tǒng)的實現(xiàn)方案

if...else : 搞一大堆if else, 一個函數(shù)寫很長很長......

swich...case : 也搞一大堆一個函數(shù)寫很長很長......

FSM的實現(xiàn)方案

根據(jù)具體的業(yè)務(wù)需要, 將業(yè)務(wù)的處理流程定義為一個狀態(tài)機, 此狀態(tài)機中存在以下必要元素

  1. 根據(jù)業(yè)務(wù)需要, 拆解抽象出若干個不同狀態(tài) State, 并確定此狀態(tài)機的初始狀態(tài);

  2. 根據(jù)實現(xiàn)需要, 抽象出用于觸發(fā)狀態(tài)轉(zhuǎn)換的事件 Event;

  3. 為了處理一個Event, 需要定義狀態(tài)的轉(zhuǎn)換過程Transition;

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

用張簡圖來說明一下

C++怎么實現(xiàn)一個有限狀態(tài)機

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

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

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

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

  5. 如果上面(4)中的Event有效, 則進行狀態(tài)轉(zhuǎn)換;

  6. 狀態(tài)轉(zhuǎn)換具體來說涉及到三個回調(diào)函數(shù):

            6.1 當前state離開, 是第一個回調(diào),需要使用者根據(jù)實際需要處理;

            6.2 trasition這個轉(zhuǎn)換過程, 是第二個回調(diào);
            6.3 新state的進入, 是第三個回調(diào);

一個簡單的狀態(tài)機,差不多就是上面這些內(nèi)容, 剩下的就是用程序語言把它實現(xiàn)出來了;

FSM的C++ 實現(xiàn)

一個用C++11實現(xiàn)的FSM的代碼

https://github.com/DavidLiuXh/kuafu

實現(xiàn)簡介:

主要就是按deamo里的思路, 封裝了以下幾個模塊

MachineSet,
Machine,
Event,
Transition,
Predicate

對于Event的處理, 提供兩種方案:

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

  2. 不使用MachineSet提供的event fifo, 實現(xiàn)自己的MachineSetHandler, 將其實例注冊到MachineSet, 從event的派發(fā);

一個具體的實現(xiàn)

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

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

C++怎么實現(xiàn)一個有限狀態(tài)機

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

在Birth()函數(shù)中構(gòu)造 state和 transition, Birth()是StateMachine的一個虛函數(shù), 每個用戶實現(xiàn)的Machine都需要實現(xiàn)它:

C++怎么實現(xiàn)一個有限狀態(tài)機

創(chuàng)建MachineSet, 并開始event處理線程

C++怎么實現(xiàn)一個有限狀態(tài)機

創(chuàng)建用戶定義的Machine, 設(shè)置初始狀態(tài)

C++怎么實現(xiàn)一個有限狀態(tài)機

設(shè)置state和transition相應(yīng)的回調(diào)

C++怎么實現(xiàn)一個有限狀態(tài)機

模擬event發(fā)生:

C++怎么實現(xiàn)一個有限狀態(tài)機

“C++怎么實現(xiàn)一個有限狀態(tài)機”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!


分享標題:C++怎么實現(xiàn)一個有限狀態(tài)機
當前地址:http://weahome.cn/article/ihjcjs.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部