一个有限状态机的C++实现
女主宣言
有限状态机:表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型。它对数字系统的设计具有十分重要的作用。常见的计算机就是使用有限状态机作为计算模型的;电脑游戏设计中也经常使用有限状态机模型。本文就讲讲一个状态机的C++实现。
PS:丰富的一线技术、多元化的表现形式,尽在“HULK一线技术杂谈”,点关注哦!
有限状态机
什么是有限状态机?
简单说就是作一件事可能会经过多个不同状态的转换, 转换依赖于在不同时间发生的不同事件来触发, 举个例子,比如 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发生:
相关源码:
MachineSet:https://github.com/DavidLiuXh/kuafu/blob/master/fsm/machine_set.h
Machine:https://github.com/DavidLiuXh/kuafu/blob/master/fsm/machine.h
Event:https://github.com/DavidLiuXh/kuafu/blob/master/fsm/event.h
Transition:https://github.com/DavidLiuXh/kuafu/blob/master/fsm/transition.h
Predicate:https://github.com/DavidLiuXh/kuafu/blob/master/fsm/transition_predicate.h
kuafu::StateMachine:https://github.com/DavidLiuXh/kuafu/blob/master/fsm/machine.h
HULK一线技术杂谈
由360云平台团队打造的技术分享公众号,内容涉及云计算、数据库、大数据、监控、泛前端、自动化测试等众多技术领域,通过夯实的技术积累和丰富的一线实战经验,为你带来最有料的技术分享
一个有限状态机的C++实现相关推荐
- 《数学之美》第12章 有限状态机—地图与本地搜索的核心技术
智能手机的定位和导航功能,其实只有三项关键技术: 第一,利用卫星定位 第二,地址的识别 第三,根据用户输入的起点和终点,在地图上规划最短路线或者最快路线 1 地址分析和有限状态机 地址的识别和分析是本 ...
- JavaScript与有限状态机
有限状态机(Finite-state machine)是一个非常有用的模型,可以模拟世界上大部分事物. 简单说,它有三个特征: * 状态总数(state)是有限的. * 任一时刻,只处在一种状态之中. ...
- 「译」有限状态机在 CSS 动画中的应用
原文地址:css-animations-with-finite-state-machines 原文作者:David Khourshid 译文出自:阿里云翻译小组 译文链接:github.com/daw ...
- FPGA中有限状态机的状态编码采用格雷码还是独热码?
今天看<从算法设计到硬件逻辑的实现>这本电子书时,遇到了一个问题,就是有限状态机的编写中,状态编码是采用格雷码还是独热码呢?究竟采用哪一种编码呢? 采用独热码为什么节省许多组合电路? 等等 ...
- 基于C++有限状态机的实现技术
一.引言言 有限状态机是一种用来进行对象行为建模的工具,其作用主要是描述对象在它的生命周期内所经历的状态序列,以及如何响应来自外界的各种事件.在面向对象的软件系统中,一个对象无论多么简单或者多么复杂, ...
- 深入浅出理解有限状态机
有限状态机 有限状态机是一种用来进行对象行为建模的工具,其作用主要是描述对象在它的生命周期内所经历的状态序列,以及如何响应来自外界的各种事件.在计算机科学中,有限状态机被广泛用于建模应用行为.硬件电路 ...
- 数学之美 系列十 有限状态机和地址识别
数学之美 系列十 有限状态机和地址识别 地址的识别和分析是本地搜索必不可少的技术,尽管有许多识别和分析地址的方法,最有效的是有限状态机. 一个有限状态机是一个特殊的有向图(参见有关图论的系列),它包括 ...
- 一个基于ngrx的计数器例子
(1) 定义action 从@ngrx/store导入Action,新建一个Action的子类: (2) 实现reducer,根据不同的action type,返回不同的store store要存储的 ...
- HDLBits答案(22)_基于有限状态机的计数器
基于有限状态机的计数器 HDLBits链接 前言 今天更新搭建更大的电路部分的习题,内容主要跟计数器和有限状态机有关. 题库 Counter with period 1000 构造一个0-999的计数 ...
最新文章
- 【Android FFMPEG 开发】C++ 回调 Java 方法 模板 ( JavaVM *vm | JNIEnv *env | jobject instance | 引用类型 | 模板代码示例 )
- 如何在Ubuntu中安装java jdk
- 有限服务器延时计算_新建三座超级数据中心,增超百万台服务器 阿里云数据中心选址有何逻辑?...
- 设置eclipse中的编辑区的背景颜色、注释文字的颜色、修改注释内作者名和时间
- ICCV 2021 | 模型安全不容忽视!特定样本触发器的隐形后门攻击方法
- UOJ 55 【WC2014】紫荆花之恋——点分治+平衡树
- SBUS调试助手 sbus解析,sbus协议
- openproj不能修改日期的原因分析与解决
- 度中心性(degree)、接近中心性(closeness)和中介中心性(betweenness)的理解
- 生活中的 真、善、美
- 软件测试中的Bug基础知识总结
- Python:正则表达式 re.sub()替换功能
- 一万一千字!结合代码超详细讲解SQL执行流程(二)!干货到底!建议收藏!
- 康奈尔大学计算机硕士要求,申请康奈尔大学计算机硕士需要什么条件呢
- 【日拱一卒行而不辍20221010】自制操作系统
- 装饰模式--小美的生日蛋糕
- LifeKeeper 双机软件 集群软件 双机热备份软件
- 20种洛杉矶天使之城电影luts调色预设
- 基于vue的tiptap编辑器插件(一)
- Exchange 启用AD账户已经存在或者不存在两种情况
热门文章
- 诗和远方:无题(五十二)- 写给认识的一个老姐的两只猫
- linux网卡顺序问题,linux网卡绑定及网卡顺序变更测试.docx
- Nodejs学习笔记(七)——接口API
- [蓝桥杯]2018年第九届省赛真题C/C++ B组 填空+大题
- c语言常用算法分析 微盘,C语言常用算法归纳.pdf
- 写文件 追加到开始_文件和流
- apache 支持php urlmanager,Yii中urlManager的配置
- python没有上方工具栏_PyQt5快速上手基础篇8-菜单栏、工具栏和状态栏
- MySQL无法启动服务器(1067)
- python-玉米(小米)商城作业