2015-10-12 5 views
0

Совместные подпрограммы в C++ - это действительно мощный метод для реализации государственных машин, однако примеры, которые я нахожу в Интернете, чрезмерно упрощены, например. они обычно представляют собой своего рода итератор, который после вызова некоторой «следующей» процедуры движется вперед, зависящий только от начальных аргументов сопрограммы. Однако в достаточно сложных состояниях на основе состояний каждый следующий шаг зависит от конкретного события, которое было вызвано возобновлением работы, а также некоторых обработчиков событий по умолчанию должны быть реализованы для событий, которые могут произойти в любое время.Событийный конечный автомат в C++ с сопрограммами

Предположим, у нас есть простой автомат для телефона.

СОСТОЯНИЕ: HOOK OFF -> [ЭВТ: ДИАЛ TONE] -> [STATE: НАБОР] -> [ЭВТ: набранный номер] -> STATE: ГОВОРИТЬ.

Теперь мне нужна сопрограмма, которая увидит что-то вроде.

PhoneSM() 
{ 
HookOf(); 
Yield_Till(DialTone_Event); 
Dial(); 
Yield_Till(EndOfDial_Event); 
Talk(); 
... 
} 

e.g. Требования

  1. Yield_Till будет продолжаться только тогда, когда конкретное событие было получить (как ???), когда couroutine пробег resumed.If нет, то он должен дать снова.

  2. Yield_Till должен знать, как запускать события для обработчиков по умолчанию, таких как Hangup_Event, потому что на самом деле это может произойти в любое время, и будет громоздким, чтобы каждый раз добавлять вызов yield.

Любая помощь в реализации C++ (only !!!) или готовых инфраструктур для удовлетворения требований будет высоко оценена.

ответ

0

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

Существует ряд вариантов реализации в общественном достоянии, и некоторые операционные системы (например, Windows) предлагают услуги сопутствующего обслуживания. Просто Google для совместной работы или волокна.

1

Мне кажется, что вы пытаетесь закодировать конечный автомат, управляемый событиями, в виде последовательной блок-схемы. Разница между государственными-диаграмм и блок-схем является довольно основным, и объясняется, например, в статье "A Crash Course in UML State Machines":

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