Использование StateMachineCompiler(SMC) в собственном коде

Здравствуйте, я хочу использовать State Machine Compiler (SMC) с C# http://smc.sourceforge.net/

я создал sm-файл для описания конечного автомата и сгенерировал из него код C#.

Затем я создал свой собственный класс MyClass, добавил сгенерированный класс, созданный с помощью smc, и реализовал методы.

Моя проблема в том, как я могу запустить эту машину состояний? С циклом while, асинхронным вызовом или библиотекой задач? Что такое элегантный способ?

Statemachine - это поведение для отправки данных через последовательный порт. Так что пользователь может вызвать MyClass.Send(Data) и StateMachine должен работать за кулисами.

Может кто-нибудь дать мне пример, как использовать statemachine в собственном коде?

С уважением Рубиктубик

1 ответ

Решение

Я использовал SMC во многих приложениях, и я был очень доволен этим. Я столкнулся с той же проблемой, что и вы. SMC генерирует код для C#, который является синхронным и линейным. Это означает, что если вы выполняете транзакцию, вызывая fsm.YourTransaction() и случайно где-то в середине этой транзакции вы выполняете другую транзакцию, она будет вызвана напрямую. Это очень опасно, поскольку нарушает базовый принцип конечного автомата - транзакции являются атомарными, и система гарантированно находится в одном состоянии или в одном переходе все время.
Когда я понял эту скрытую проблему, я реализовал асинхронный слой над кодом конечного автомата, сгенерированным SMC. К сожалению, я не могу предоставить вам код, потому что он лицензирован, но я могу описать принцип здесь.
Я заменил прямые вызовы методов асинхронной обработкой событий: существует очередь, ожидающая транзакций. Транзакции представлены строками, которые должны совпадать с методами транзакций в fsm. Они удаляются из очереди один за другим в независимом потоке. Строка транзакции преобразуется в вызов метода fsm. Эта концепция отлично зарекомендовала себя во многих критических приложениях. Это довольно просто реализовать и легко расширить с помощью новых функций. Окончательная форма этого асинхронного слоя имела следующие дополнительные функции:

  1. Идеальное ведение журнала: все транзакции и их аргументы, время прибытия, время обработки... и т. Д.
  2. Возможность замены независимого потока на внешний поток - иногда лучше обрабатывать вещи в потоке, предоставленном извне (графический интерфейс Windows очень чувствителен к вызовам внешних потоков...)
  3. Предварительная обработка транзакций - иногда ожидалось, что система изменит состояние, только если произошла последовательность транзакций. Это довольно неуклюже, чтобы достигнуть этого непосредственно с SMC. Я реализовал так называемые "преобразования транзакций" - можно было объявить, как набор транзакций превращается в одну транзакцию.
Другие вопросы по тегам