代码之家  ›  专栏  ›  技术社区  ›  THX-1138

状态机:如何在没有外部事件的情况下改变状态(瞬态)?

  •  2
  • THX-1138  · 技术社区  · 16 年前

    情景:
    我有一个简单的状态机:

    快乐之路:

    Uninitialized->Initialized->InProgress->Done
    

    不快乐的路径:

    Uninitialized->Initialized->Error
    

    简单地说,我需要引起一个转换(进入正在进行或错误状态) 没有外部事件/触发器 . 即,初始化状态应立即导致这些状态之一。

    问题:

    1. 从内部引起状态转换可以吗 已初始化。输入()) ?
    2. 我可以用 国家卫队 要做到这一点,但我不希望在状态保护中使用非平凡的逻辑(初始化很可能很复杂)。
    3. 如果不好,我该怎么做呢?
    4. 我应该一起从FSM中做出这个决定,并让其他组件引起适当的转换吗?但是,我不需要从内部调用外部组件吗? 已初始化。输入()) ?所以它什么也解决不了?
    1 回复  |  直到 16 年前
        1
  •  2
  •   mouviciel    16 年前

    在状态机中,下一个状态是输入和当前状态的组合逻辑函数。

    在你描述的情况下,同样的原因( Initialized 状态)似乎能够触发两种不同的效果(或者 InProgress Error 状态)。我想有一个隐藏的输入,它的值会产生差异。我还想这个输入是在从 Uninitialized 初始化 .

    因此,我会有一个不同的模型:

    Uninitialized -> Successfully initialized -> InProgress -> Done
                 \
                  `-> Failed Initialization -> Error
    

    可能组合 Successfully initialized 具有 正在进行中 Failed initialization 具有 误差 .


    编辑 :从您的评论中,我了解到隐藏输入实际上是操作(设备初始化)的结果。以您的模型为例,我假设初始化发生在 初始化 状态(我们称之为 Initializing )。这样,设备的结果就是您的外部事件,它将触发转换到 正在进行中 误差 .

    因此,保留状态机并简单地添加 device.Initialize() 输入或外部事件列表。