【问题标题】:State machine pushing events to its own event queue状态机将事件推送到自己的事件队列
【发布时间】:2013-06-22 17:05:12
【问题描述】:

我目前正在研究分层状态机(UML 状态机、状态图等),以下我不清楚:

在转换期间和从状态将事件推送到机器自己的事件队列是否有效,如果是,它在实践中是否安全使用,还是应该避免?这样做是否有某些影响(至少是实现的怪癖,正交区域发挥作用时的问题,或类似的问题)?

我将用两个虚拟机器来说明这个问题:

  1. 以下机器将处于状态A 等待事件A_to_B,之后它会通过将事件作为转换动作分派而进入无限循环:

          +-----+                    +-----+                    +-----+
          |  A  |  A_to_B /          |  B  |  B_to_C /          |  C  |
          |-----|   dispatch B_to_C  |-----|   dispatch C_to_A  |-----|
    O---->|     +------------------->|     +------------------->|     |
          |     |                    |     |                    |     |
          +-----+                    +-----+                    +-----+
             ^                                C_to_A /             |
             |                                 dispatch A_to_B     |
             +-----------------------------------------------------+
    
  2. 通过将事件作为入口操作分派,以下机器将立即进入无限循环:

          +-------------------+           +-------------------+           +-----+
          |         A         |           |         B         |           |  C  |
          |-------------------|  A_to_B   |-------------------|  B_to_C   |-----|
    O---->| on entry:         +---------->| on entry:         +---------->|     |
          |  dispatch A_to_B  |           |  dispatch B_to_C  |           |     |
          |                   |           |  dispatch C_to_A  |           |     |
          +-------------------+           +-------------------+           +-----+
             ^                                                               |
             |                                                   C_to_A      |
             +---------------------------------------------------------------+
    

【问题讨论】:

  • 我不知道发生了什么。但是,如果您要对事件进行排队,那么最好将进程分离到单独的处理器/内核。然后,您可以控制每个的优先级。共享内存也很有用。
  • + 用于 ASCII 绘图来解释问题,你是如何绘图的?
  • 我用asciiflow.com画了这些

标签: events transitions fsm state-machine


【解决方案1】:

状态机可以向自身发布事件,但这有特殊目的,例如将较长的运行到完成 (RTC) 步骤分解为较短的部分。您可能希望这样做以在您的 RTC 步骤太长之间启用系统中的其他状态机(或更一般地说是活动对象)的调度。

特别是对于您的示例,在这种情况下,我会尽量避免向 self 发布事件。通常我看到人们在混淆状态图和流程图时会这样做。状态图需要事件从一个状态转换到另一个状态。完成框中指定的计算后,流程图会自动从一个处理框转换到另一个处理框。显然,当您向自己发布事件时,您会将状态图变成流程图。所以,你真的需要流程图而不是状态图,因为你真的不需要等待任何东西。您继续全速处理。

您也可以这样查看。事件的目的是为状态机提供新信息。这就是状态机“学习”的方式。但是,当您向自己发布事件时,您不会获得任何新知识。您需要的所有知识都已由原始“真实”事件提供。因此,您有足够的信息在一个转换中执行所有这些处理,而不是将其分散在许多“状态”中,这实际上是这个冗长处理的阶段。

【讨论】:

  • 哇,除了 Miro Samek 本人之外没有其他人的回答!您关于 UML 状态图的材料是必不可少的,并且在我研究该主题期间帮助了我很多。确实,这就是我最初问的原因,它让我印象深刻,相当于状态机的“代码气味”。由于我将实现 HSM 框架,因此我希望它尽可能轻巧,但仍然足够强大。与此同时,我正在设计一个中等复杂的 GUI 应用程序作为概念验证,而我缺乏 HSM 经验让我怀疑我是否需要更强大的功能或者我的设计是错误的 :)
猜你喜欢
  • 1970-01-01
  • 2013-12-24
  • 1970-01-01
  • 2021-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多