假设您有一个对象'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应该摆脱的权利吗?我是否需要拥有状态机的层次结构?
有关解决这个问题的“正确”方法的任何想法?任何要阅读的链接或论文都会很棒,代码会更好。
谢谢!
答案 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视频是一个很好的起点,但我还建议使用以下来源: