iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >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://www.lsjlt.com/news/233982.html(转载时请注明来源链接)

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

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • c语言怎么计算字符串长度
    在C语言中,可以使用内置的strlen()函数来计算字符串的长度。该函数位于string.h头文件中。以下是一个示例代码: #inc...
    99+
    2024-05-14
    c语言
  • c语言怎么判断三个数的大小
    可以通过比较三个数之间的大小关系来判断它们的大小。以下是一个示例代码: #include <stdio.h> int ...
    99+
    2024-05-14
    c语言
  • c++排序函数sort怎么使用
    在C++中,使用sort函数对容器中的元素进行排序,可以按照默认的升序排列,也可以自定义排序规则。 下面是一个简单的例子,对一个ve...
    99+
    2024-05-14
    c++
  • c++中string的compare函数怎么使用
    在C++中,可以使用string的compare函数来比较两个string对象的大小。该函数的原型如下: int compare(c...
    99+
    2024-05-14
    c++
  • c++中string的compare函数有什么用
    c++中string的compare函数用于比较两个字符串的大小关系。该函数返回一个整数值,表示两个字符串的比较结果。 具体来说,如...
    99+
    2024-05-14
    c++
  • c++中print函数的功能有哪些
    在C++中,通常使用std::cout来进行输出操作,而不是使用print函数。std::cout是C++标准库中的一个输出流对象,...
    99+
    2024-05-14
    c++
  • c语言数据结构怎么使用
    在C语言中,数据结构可以通过定义结构体来实现。以下是一些常见的数据结构的使用方法示例: 链表: #include <std...
    99+
    2024-05-14
    c语言
  • c++中print函数的用法是什么
    在C++中没有内置的print函数,但可以使用cout来输出内容到控制台。cout是C++标准库中的一个输出流对象,可以使用<...
    99+
    2024-05-14
    c++
  • c++中concept的用法是什么
    在C++20中,Concept是一种新的语言特性,用于定义类型要求和约束。Concept可以被用来约束函数模板、类模板和普通函数的参...
    99+
    2024-05-14
    c++
  • c++中concept的作用是什么
    在C++中,concept的作用是定义一种通用的约束,用于限制模板参数的类型范围。通过使用concept,可以在编译时对模板参数进行...
    99+
    2024-05-14
    c++
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作