2013-08-13 3 views
1

Привет я хочу использовать State Machine Compiler (SMC) с C# http://smc.sourceforge.net/Использование StateMachineCompiler (SMC) в собственном коде

я создал СМ-файл для описания состояния машины и генерируемый C# код из него ,

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

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

Statemachine является положением для отправки данных через последовательный порт. Чтобы пользователь мог вызвать MyClass.Send (Data), а StateMachine должен работать за шторами.

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

С уважением rubiktubik

ответ

1

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

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

Спасибо за совет! Я пробую ваш aproach! – rubiktubik

Смежные вопросы