2013-02-25 75 views
3

SCXML狀態機中,我該怎麼說「在進入此狀態3分鐘後觸發事件,但如果我坐在狀態2.9分鐘然後離開,則不會。我重新進入狀態,重新啓動計時器(不要在0.1分鐘內關閉)「在SCXML狀態機中創建超時

+0

+1內容豐富。您使用SCXML的平臺是什麼? – deepmax 2013-02-25 23:08:52

+0

@MM。我正在使用[我自己的翻譯](https://github.com/Phrogz/LXSC),它在[定製硬件](http://shield.nvidia.com/)上的Lua上運行。 (這個基於Lua的解釋器可能會在不久的將來被一個定製的C++解釋器替代。) – Phrogz 2013-02-25 23:19:34

回答

2

使用<send>在進入狀態時觸發延遲事件(帶有任何名稱,例如」超時「),並且退出狀態以刪除計時器時使用<cancel>。您必須確保您爲每個計劃稍後取消的實例創建一個唯一的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> 

注:只能使用兩種s(秒)或ms(毫秒)的延遲時間,每CSS2 time spec。因此,3分鐘是180s

+1

只是爲將來的用戶提供的一個提示......上面的答案很接近但並不準確。 請參閱http://www.w3.org/TR/2006/WD-scxml-20060124/ 在send中,將id改爲sendid。它會發送很好,但設置取消的ID - 它不會正確取消。直到我走了調度程序代碼,我才意識到這一點,它並沒有觸發! @ sendvanid =「state1-timer」event =「timeout」delay =「180s」/> 2013-10-03 17:58:04

+0

@EvanReynolds您的評論基於舊的SCXML規範工作草案。根據[候選推薦](https://www.w3.org/TR/scxml/#send),''元素具有'id'屬性,而不是'sendid'屬性。 (並且''元素[使用'sendid'屬性](https://www.w3.org/TR/scxml/#cancel)。) – Phrogz 2017-06-14 20:41:12

+0

當我寫評論時是最新的。 :-)感謝您提供最新信息,這很好理解! – 2017-06-20 00:04:46