5

我目前正在研究分层状态机(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      |
             +---------------------------------------------------------------+
    
4

1 回答 1

6

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

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

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

于 2013-06-23T02:13:44.287 回答