当前位置: 首页 > 知识库问答 >
问题:

状态机表示

祁彬
2023-03-14

我想把GUI实现为一个状态机。我认为这样做有一些好处,也有一些缺点,但这不是这个问题的主题。

在读了一些关于这方面的文章后,我发现了几种用C语言建模状态机的方法,我坚持使用2,但我不知道哪种方法更适合GUI建模。

>

  • 用以下方法将状态机表示为状态列表:

    • OnEvent(…)

    来自状态机::OneEvent(…) 我将事件转发到CurrentState::OneEvent(…) 这里决定是否进行转换。在转换时,我调用CurrentState::OnExitState(…)NewState::OneInterState()CurrentState=NewState

    通过这种方法,状态将与动作紧密耦合,但是当我从一个状态转到多个状态,并且我必须为不同的转换采取不同的动作时,state可能会变得复杂。

    将状态机表示为具有以下属性的转换列表:

    • InitialState

    从StateMachine::OnCase(...)我将事件转发到状态机中的所有转换,其中初始状态货币状态具有相同的值。如果满足转换条件,则停止循环,调用DoTrantion方法,并将货币状态设置为过渡::FinalState

    使用这种方法,转换将非常简单,但是转换计数的数量可能会非常高。当一个状态接收到事件时,跟踪将执行什么操作也将变得更加困难。

    你认为什么方法对图形用户界面建模更好。你知道其他可能对我的问题更好的表示方式吗?


  • 共有3个答案

    丁勇
    2023-03-14

    我个人更喜欢你说的第一种方法。我发现第二种方法非常违反直觉,过于复杂。为每个状态设置一个类非常简单,如果在OneInterState中设置正确的事件处理程序,并在OnExitState中删除它们,那么您的代码将是干净的,所有内容都将在相应的状态中自包含,便于阅读。

    您还将避免使用大量switch语句来选择要调用的正确事件处理程序或过程,因为状态所做的一切在状态本身内部都是完全可见的,从而使状态机代码简短而简单。

    最后但并非最不重要的一点是,这种编码方式是从状态机绘图到您将使用的任何语言的精确转换。

    常俊侠
    2023-03-14

    我不知道这是不是你期待的那种答案,但我过去常常以直截了当的方式处理这种状态机。

    使用枚举类型的状态变量(可能的状态)。在GUI的每个事件处理程序中,测试状态值,例如使用switch语句。执行相应的处理,并设置状态的下一个值。

    轻量灵活,保持代码的规则性使其具有可读性和“形式化”。

    尚恩
    2023-03-14
    匿名用户

    这是第三种选择:

    • 将状态机表示为转移矩阵

    来自状态机::OneEvent(…) 事件被转发到状态::OneEvent,它返回一个符号——执行的结果<代码>状态机然后根据当前状态和返回的符号决定

    • 必须转换到不同的状态,或

    3个状态和3个符号的示例矩阵

    0 1 2
    1 2 0
    2 0 1
    

    在这个例子中,如果机器处于任何状态,(0,1,2)State::OnEntertainment返回符号0(矩阵中的第一行)-它保持在相同的状态

    第二行表示,如果当前状态为0,返回的符号为1,则转换为状态1。对于州1-

    类似的第三行表示,对于符号2,状态0-

    重点是:

    1. 符号的数量可能会比州的数量少得多

     类似资料:
    • 主要内容:实例,实例,实例,实例,实例,实例关键词:状态机,售卖机 有限状态机(Finite-State Machine,FSM),简称状态机,是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型。状态机不仅是一种电路的描述工具,而且也是一种思想方法,在电路设计的系统级和 RTL 级有着广泛的应用。 状态机类型 Verilog 中状态机主要用于同步时序逻辑的设计,能够在有限个状态之间按一定要求和规律切换时序电路的状态。状态的切换方

    • 概述 Javascript Finite State Machine函数库 参考链接 概述 有限状态机(Finite-state machine)是一个非常有用的模型,可以模拟世界上大部分事物。 简单说,它有三个特征: 状态总数(state)是有限的。 任一时刻,只处在一种状态之中。 某种条件下,会从一种状态转变(transition)到另一种状态。 它对JavaScript的意义在于,很多对象可

    • 智能状态机是一个前端复杂对象优雅编程模型。 npm包中包含库和浏览器扩展 目的:更加自动和简洁的实现状态的迁移。 原理:通过装饰器,对异步函数进行包装,使得调用异步函数可以自动修改状态,并且自动实现异步调用过程中的中间状态 功能: 自动生成状态机 自动实现状态迁移 自动派发事件 可视化状态变化历史 可视化状态机图 使用例子: import { FSM, ChangeState } from 'af

    • 问题内容: 创建虚拟访客时,我需要了解虚拟访客有关运行,活动和配置脚本执行结果的信息。 我们知道,对于硬件,主机配置具有以下状态: 因此,我想了解Virtual Guest Object的完整状态列表以及SoftLayer主机电源状态的完整列表。 问题答案: VM的状态为: SoftLayer虚拟访客状态的状态:*’‘’ACTIVE’‘’:虚拟访客处于活动状态并且正在使用中。 ’‘’DISABLE

    • 问题内容: 您是否可以与我(和社区)分享的人对Python状态机的设计技巧? 目前,我将基于以下方面来选择引擎: 但是我敢肯定,在利用Python的动态特性(例如动态调度)的同时,有很多解决方法。 我追求的是针对“引擎”的设计技术,该技术接收与基于机器“状态”的事件和“事件”相对的“事件”和“事件”。 问题答案: 我真的不明白这个问题。该 国设计模式是相当清楚的。。 这是非常常见的样板,可用于Ja

    • 概述 FSM (有限状态机) 可以mixin到akka Actor中,其概念在Erlang 设计原则中有最好的描述。 一个 FSM 可以描述成一组具有如下形式的关系 : State(S) x Event(E) -> Actions (A), State(S') 这些关系的意思可以这样理解: 如果我们当前处于状态S,发生了E事件,则我们应执行操作A,然后将状态转换为S’。 一个简单的例子 为了演示F