如何创建可以处理同时发生的事件的有限状态机

How to create a finite state machine that can process simultaneous events

假设您有一个对象 'A' 可能从外部对象接收以下事件:

事件 1

活动 2

...

事件 n

现在假设承载 'A' 的框架是这样的,所有相关事件都将传递给 'A'(一次一个),然后 A::doEval()打电话。

请务必注意,'A' 可以按任何顺序接收任何事件组合。 'A' 在调用 doEval() 之前可能只获得一个事件,或者在调用 doEval() 之前可能获得 5 个事件。没有办法提前知道。

同样重要的是要注意这些事件,因为它们都是在调用 A::doEval() 之前传送到 'A',因此应被视为同时发生的事件。一个常规的状态机会对每个事件做出反应,因为它被传递给 'A'。这在我的使用案例中是不正确的...我需要 'A' 坐下来收集所有事件,并且只有在 doEval() 中才应该 'A' 执行任何操作。

现在有一个小窍门:doEval() 逻辑需要意识到只发生了事件的一个子集,但它可能需要将它们全部考虑在内。例如,代码(这很丑陋,我'我试图避免)可能看起来像这样:

doEval()
    if(Event 1 occurred && Event 2 occurred) then <do something>

就是那个 'if' 语句...我只想在两个事件都发生时执行操作,但我不想有那个 'if' 语句。这就是 FSM 应该摆脱的吧?我需要有一个状态机层次结构吗?

关于 "proper" 解决此问题的任何想法?任何可供阅读的链接或论文都很棒,代码甚至更好。

谢谢!

创建一个队列以收集指向 "A" 的所有事件并将它们从队列中弹出,然后处理事件。

我以 Harel 状态机的形式找到了我要找的东西:

http://www.mathworks.com/videos/understanding-state-machines-harel-state-machines-4-of-4-90491.html

TL/DR: 把我们都知道的状态机,加上有分层子状态、并行状态机和独立状态机之间通信(他称之为广播)的能力。

状态机的全部工作是以简洁的方式捕获事件的相关历史。状态机恰好允许您避免这种检查:

doEval()
    if(Event 1 occurred && Event 2 occurred) then <do something>

Mathworks 视频是一个很好的起点,但我还推荐以下资源: