5

現在、階層ステート マシン (UML ステート マシン、ステートチャートなど) について調査していますが、次の点がよくわかりません。

遷移中および状態からのマシン独自のイベント キューへのイベントのプッシュは有効ですか?有効である場合、実際に安全に使用されますか?それとも回避する必要がありますか? これを行う際に特定の影響がありますか (少なくとも実装の癖、直交領域が機能するときの問題など)。

2 台のダミー マシンを使用して質問を説明します。

  1. 次のマシンはAevent を待機している状態になり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 ステップの間に、システム内の他のステート マシン (またはより一般的にはアクティブなオブジェクト) のスケジューリングを有効にするために、これを行うことができます。

具体的には、この場合、自分自身にイベントを投稿しないようにします。通常、ステートチャートとフローチャートを混同したときにこれを行う人を見かけます。ステートチャートには、状態から状態へ遷移するためのイベントが必要です。フローチャートは、ボックスで指定された計算が完了すると、ある処理ボックスから別の処理ボックスに自動的に遷移します。明らかに、イベントを自分自身に投稿すると、ステートチャートがフローチャートに変わります。したがって、実際には何も待たないため、ステートチャートではなくフローチャートが本当に必要です。フルスピードで処理を続けます。

このように表示することもできます。イベントの目的は、ステート マシンに新しい情報を提供することです。これが、ステートマシンが「学習」する方法です。しかし、イベントを自分に投稿しても、新しい知識は得られません。必要なすべての知識は、元の「真の」イベントによって提供されます。したがって、実際にはこの長い処理の段階である多くの「状態」に分散するのではなく、このすべての処理を 1 回の遷移で実行するのに十分な情報があります。

于 2013-06-23T02:13:44.287 に答える