Конечный автомат, отправляющий события в собственную очередь событий

В настоящее время я изучаю иерархические машины состояний (машины состояний 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      |
             +---------------------------------------------------------------+
    

person bgr    schedule 22.06.2013    source источник
comment
Я не знаю, что происходит. Но если вы ставите события в очередь, то лучше разделить процессы на отдельные процессоры/ядра. Затем вы можете контролировать приоритет каждого из них. Общая память тоже может быть полезна.   -  person Bob Blogge    schedule 22.06.2013
comment
+ для рисования ASCII, чтобы объяснить вопрос, как вы рисуете?   -  person Grijesh Chauhan    schedule 05.07.2013
comment
Я использовал asciiflow.com, чтобы нарисовать эти   -  person bgr    schedule 06.07.2013


Ответы (1)


Конечный автомат может отправлять события себе, но у этого есть особые цели, такие как разбиение более длинных шагов до завершения (RTC) на более короткие части. Возможно, вы захотите сделать это, чтобы включить планирование других конечных автоматов в системе (или, в более общем смысле, активных объектов) между слишком длинным шагом RTC.

В частности, в ваших примерах я бы постарался в этом случае не публиковать события для себя. Обычно я вижу, как люди делают это, когда путают диаграмму состояний с блок-схемой. Диаграмме состояний нужны события для перехода из состояния в состояние. Блок-схема автоматически переходит из одного блока обработки в другой после завершения вычислений, указанных в блоке. Очевидно, когда вы отправляете события себе, вы превращаете диаграмму состояний в блок-схему. Итак, вам действительно нужна блок-схема, а не диаграмма состояний, потому что вы на самом деле ничего не ждете. Вы продолжаете обработку на полной скорости.

Вы также можете просмотреть его таким образом. Целью событий является предоставление новой информации машине состояний. Так «учится» конечный автомат. Но когда вы публикуете события для себя, вы не приобретаете никаких новых знаний. Все необходимые вам знания уже доставлены исходным «истинным» событием. Итак, у вас достаточно информации, чтобы выполнить всю эту обработку всего за один переход, вместо того, чтобы распределять ее по множеству «состояний», которые на самом деле являются этапами этой длительной обработки.

person Miro Samek    schedule 23.06.2013
comment
Вау, ответ принадлежит только самому Миро Самеку! Ваш материал о диаграммах состояний UML незаменим и очень помог мне в моих исследованиях по этой теме. Действительно, именно поэтому я изначально спросил, это показалось мне эквивалентом запаха кода для конечных автоматов. Поскольку я буду реализовывать инфраструктуру HSM, я хочу, чтобы она была как можно более легкой, но при этом достаточно мощной. Наряду с этим я разрабатываю умеренно сложное приложение с графическим интерфейсом в качестве доказательства концепции, и отсутствие опыта работы с HSM заставляет меня сомневаться, нужны ли мне более мощные функции или мой дизайн неверен :) - person bgr; 23.06.2013