在SCXML状态机中创建超时

5
SCXML状态机中,我如何说“在进入此状态3分钟后触发事件,但如果我在该状态停留2.9分钟然后离开,则不要触发。如果我重新进入该状态,请重新启动计时器(不要在0.1分钟内触发)”?

+1 有用的信息。你使用什么平台来处理SCXML? - masoud
@MM。我目前正在使用我的自己的解释器,它在定制硬件上运行Lua。(这个基于Lua的解释器可能会在不久的将来被一个自定义的C++解释器替换以提高速度。) - Phrogz
1个回答

6
使用<send>触发延迟事件(任意名称,例如“timeout”),当您进入状态时,并在退出状态时使用<cancel>来删除计时器。您必须确保为您计划稍后取消的每个<send>实例创建唯一的ID。
<scxml xmlns='http://www.w3.org/2005/07/scxml' version='1.0'>
  <state id="s1">
    <onentry><send id="state1-timer" event="timeout" delay="180s"/></onentry>
    <onexit><cancel sendid="state1-timer"/></onexit>
  </state>
  <!-- ... --->
</scxml>

注意:根据CSS2时间规范,您只能使用s(秒)或ms(毫秒)来表示延迟持续时间。因此,3分钟为180s

2
给未来的用户一个提示……上面的答案接近但不完全正确。
请参阅http://www.w3.org/TR/2006/WD-scxml-20060124/中的发送,将ID更改为sendid。它会正常发送,但这会设置取消的ID - 它将无法正确取消。直到我检查了调度程序代码并发现它没有触发,我才意识到这一点!
<onentry> <send sendid="state1-timer" event="timeout" delay="180s"/> </onentry>
- Evan Reynolds
2
@EvanReynolds 您的评论基于 SCXML 规范的旧工作草案。根据候选推荐<send>元素具有id属性,而不是sendid属性。(而且,<cancel>元素使用sendid属性。) - Phrogz
1
当我写下这条评论时,它是最新的。 :-) 谢谢您提供更新的信息,这很好知道! - Evan Reynolds

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接