返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++怎么实现一个有限状态机
  • 598
分享到

C++怎么实现一个有限状态机

2023-06-03 09:06:53 598人浏览 八月长安
摘要

本篇内容介绍了“c++怎么实现一个有限状态机”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!什么是有限状态机?简单说就是作一件事可能会经过多个

本篇内容介绍了“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++怎么实现一个有限状态机”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: C++怎么实现一个有限状态机

本文链接: https://lsjlt.com/news/233982.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C++怎么实现一个有限状态机
    本篇内容介绍了“C++怎么实现一个有限状态机”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!什么是有限状态机?简单说就是作一件事可能会经过多个...
    99+
    2023-06-03
  • C++有限状态机实现详解
    目录有限状态机四大要素C++函数指针实现总结前提:因为最近打算学设计模式的状态模式,但不是很明白有限状态机和状态模式之间的关系,索性用C++实现了一个简单案例复习了一下FSM,如果有...
    99+
    2024-04-02
  • React使用有限状态机的实现示例
    目录什么是有限状态机?有限状态机的示例有限状态机和软件开发、计算机科学有什么关系?举了那么多例子,但我该怎么展示在前端开发中使用状态机呢?React 应用程序中的注册表单的传统实现方...
    99+
    2024-04-02
  • Java状态机怎么实现
    今天小编给大家分享一下Java状态机怎么实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。假设我们有两个状态这个状态转换非常...
    99+
    2023-07-06
  • JS前端实现fsm有限状态机实例详解
    目录引言举个栗子从零开始获取状态状态改变transition实现fsm状态机实现钩子函数完整代码总结引言 我们平时开发时本质上就时对应用程序的各种状态进行切换并作出相应处理,最直接的...
    99+
    2024-04-02
  • JavaScript有限状态机有什么特征
    这篇文章主要讲解了“JavaScript有限状态机有什么特征”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JavaScript有限状态机有什么特征”吧!有限...
    99+
    2024-04-02
  • Java实现有限状态机的推荐方案分享
    目录一、背景 二、推荐方式2.1 自定义的枚举 2.2 外部枚举 三、总结 一、背景 平时工作开发过程中,难免会用到状态机(状态的流转)。 如奖学金审批流程、请假审批流程、竞标流程...
    99+
    2024-04-02
  • C语言实现进程5状态模型的状态机
    目录前言什么是状态机定义举例四大概念状态机的应用进程5状态模型实现前言 状态机在实际工作开发中应用非常广泛,在刚进入公司的时候,根据公司产品做流程图的时候,发现自己经常会漏了这样或那...
    99+
    2022-11-13
    C语言 进程5状态模型 状态机 C语言 进程5状态模型 C语言 状态机
  • Android应用怎么实现一个沉浸式状态栏
    这期内容当中小编将会给大家带来有关Android应用怎么实现一个沉浸式状态栏,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。效果。导航栏问题在Android中,顶部导航栏目前常用的两种实现方式,一个是通过T...
    99+
    2023-05-31
    android roi
  • C#中怎么实现一个动态数组
    C#中怎么实现一个动态数组,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。数组的容量是固定的,但ArrayList的容量可以根据需要自动扩充。当我们修改了ArrayList的...
    99+
    2023-06-17
  • 一文详解Go语言中的有限状态机FSM
    目录1、FSM简介1.1 有限状态机的定义1.2 Go中的FSM2、github.com/looplab/fsm 如何使用2.1 fsm 基础使用2.2 fsm 中 Action 何...
    99+
    2023-05-17
    Go语言有限状态机FSM Go 有限状态机 Go FSM
  • Android应用怎么实现一个浮动状态栏效果
    这期内容当中小编将会给大家带来有关Android应用怎么实现一个浮动状态栏效果,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。首先:要实现的是浮动状态栏效果,通过在Activity的onCreate方法中调...
    99+
    2023-05-31
    android roi
  • C#中对象状态模式怎么实现
    这篇文章主要介绍了C#中对象状态模式怎么实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C#中对象状态模式怎么实现文章都会有所收获,下面我们一起来看看吧。定义枚举表示教程进度首先用一个枚举,表示教程进行的不同...
    99+
    2023-06-30
  • 怎么在html5中使用canvas实现一个动态画饼状图
    怎么在html5中使用canvas实现一个动态画饼状图?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。先用canvas画实心圆//伪代码var canv...
    99+
    2023-06-09
  • State状态模式怎么实现
    本文小编为大家详细介绍“State状态模式怎么实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“State状态模式怎么实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。 举例...
    99+
    2024-04-02
  • C++中怎么实现一个LeetCode
    这篇文章给大家介绍C++中怎么实现一个LeetCode,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。[LeetCode] 128.Longest Consecutive Sequence 求最长连续序列Given an...
    99+
    2023-06-20
  • C#中怎么实现一个随机数发生器
    C#中怎么实现一个随机数发生器,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。***种方法不指定随机种子,系统自动选取当前时间作为随机种子:Random ro&nb...
    99+
    2023-06-18
  • c# 实现打印机状态查询与阻塞打印
    目录打印机状态获取打印机脱机检查打印机阻塞队列实现 在使用winform编写自动打印服务的过程中,发现只要进行了打印命令的调用,文档就会进入到打印等待队列,如果打印机无法正常工作,则...
    99+
    2024-04-02
  • 函数指针方法怎么实现简单状态机
    本篇内容主要讲解“函数指针方法怎么实现简单状态机”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“函数指针方法怎么实现简单状态机”吧!状态机简介有限状态机FSM是有限个状态及在这些状态之间的转移和动...
    99+
    2023-06-15
  • thinkphp中怎么实现一个无限分类
    今天就跟大家聊聊有关thinkphp中怎么实现一个无限分类,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。function getSonLi...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作