1

您好,我想将状态机编译器 (SMC) 与 C# http://smc.sourceforge.net/一起使用

我创建了 sm 文件来描述状态机并从中生成 c# 代码。

然后我创建了自己的 MyClass 类,添加使用 smc 生成的生成类并实现方法。

我的问题是如何运行这个状态机?使用 While 循环、异步调用或任务库?什么是优雅的方式?

Statemachine 是一种通过串口发送数据的行为。这样用户就可以调用 MyClass.Send(Data) 并且 StateMachine 应该在幕后工作。

有人可以给我一个如何在自己的代码中使用状态机的例子吗?

问候 rubiktubik

4

1 回答 1

1

我在很多应用中都使用过 SMC,对此我非常满意。我遇到了和你一样的问题。SMC 为 C# 生成同步和线性的代码。这意味着如果您通过调用 fsm.YourTransaction() 发出一个事务,并且偶然在该事务中间的某个地方发出另一个事务,它将被直接调用。这是非常危险的,因为它打破了状态机的基本原则——事务是原子的,并且系统保证始终处于单一状态或单一转换。
当我意识到这个隐藏的问题时,我在 SMC 生成的状态机代码之上实现了一个异步层。不幸的是,我无法为您提供代码,因为已获得许可,但我可以在这里描述原理。
我用异步事件处理替换了直接方法调用:有一个队列等待事务。事务由字符串表示,必须与 fsm 中的事务方法相同。它们在一个独立的线程中被一个一个地从队列中移除。事务字符串转换为 fsm 方法调用。事实证明,这一概念在许多关键应用中都非常有效。它实现起来相当简单,并且易于使用新功能进行扩展。此异步层的最终形式具有以下附加功能:

  1. 完美的日志记录:所有事务及其参数、到达时间、处理时间……等等。
  2. 可以用外部线程替换独立线程 - 有时最好在外部提供的线程中处理事物(Windows GUI 对外部线程调用非常敏感......)
  3. 事务的预处理——有时系统只在一系列事务发生时才被期望改变状态。直接用SMC来实现比较笨拙。我实现了所谓的“事务转换”——可以声明一组事务如何转换为单个事务。
于 2014-04-25T12:13:12.297 回答