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

时间:2015-10-04 13:28:44

标签: algorithm graph-algorithm state-machine fsm

假设您有一个对象'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应该摆脱的权利吗?我是否需要拥有状态机的层次结构?

有关解决这个问题的“正确”方法的任何想法?任何要阅读的链接或论文都会很棒,代码会更好。

谢谢!

3 个答案:

答案 0 :(得分:0)

建立队列以收集指向“A”的所有事件,然后从队列中弹出它们,然后处理事件。

答案 1 :(得分:0)

我以Harel State Machines的形式找到了我想要的东西:

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

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

答案 2 :(得分:0)

状态机的整个工作是以简洁的方式捕获事件的相关历史记录。状态机正好允许您避免检查类型:

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

Mathworks视频是一个很好的起点,但我还建议使用以下来源: