我有一些代碼實現基於Boost MSM庫的狀態機。它一直致力於偉大的,直到我不得不添加的行會推遲仿前端的事件:推遲Meta狀態機在推遲事件時結束堆棧溢出
Row < StateX, Event1, none, Defer, none >
現在,每當該行被擊中,線程一擊堆結束。我已經通過MSM中的方法調用進行跟蹤,不幸的是,一切似乎按照設計工作。這些是執行以下步驟:
- process_event被調用,事件1
- 事件1被添加到延遲的事件隊列推遲算符內
- 由於行處理成功,處理被設置爲TRUE
- 在在process_event的結尾,有代碼可以處理無事件轉換。這個代碼是必需的,因爲如果一個事件導致從狀態A移動到B,B可能會自動轉換到不同的狀態,這是唯一會被處理的地方(在我的代碼中,我沒有使用任何這些邏輯仍然被調用)
- eventless_helper調用process_event,類型爲「無」
- 的事件在處理「無」(無實際工作),代碼現在看到的是有一個在隊列中的延遲的事件,所以它會轉移它並調用process_event再次。
- 現在我們重複第1步的所有內容,但是我們仍然在上一步的功能之內,所以這個過程一直持續到我們耗盡堆棧爲止。
似乎推遲事件的邏輯與處理無事件轉換的邏輯發生衝突,我非常想嘗試進入boost代碼並破解後者。看起來,如果事件是「被擊敗」,它不應該被視爲處理,如果是這樣的話,無事件轉換不會被解僱(因爲他們不應該),但是然後狀態機器最終會一個no_transition調用本質上是一個全面的意外錯誤處理程序。這也需要入侵我想避免的庫代碼。
但是在我做任何事之前,我想看看是否有其他人找到了。或者給我建議,在哪裏可以獲得這方面的幫助。
更新: 顯然我的公司使用的Boost庫版本是1.44,並且該版本中存在延遲事件處理的錯誤。它固定在1.46.1。
確實,在1.44中有一個錯誤,正如你發現的那樣,它被固定在1.46。如果你出於某種原因被困在1.44中,你可以通過添加到任何狀態定義來強制延遲事件來解決這個問題:typedef mpl :: vector * any event * /> deferred_events; – 2011-04-26 19:13:58