2013-06-22 83 views
4

我目前正在研究分層狀態機(UML狀態機,狀態圖等),下面是我不清楚:狀態機推活動,自己的事件隊列

正在推動事件機器本身的事件隊列在轉換過程中以及從有效的狀態出發,如果是,它是否在實踐中安全使用或應該避免?在做這件事情時是否存在某些暗示(至少存在實施怪癖,正交區域發揮作用時的問題等)?

我將舉例說明有兩個虛擬機的問題:

  1. 以下機牀將是狀態A等待事件A_to_B後,它會通過分派事件轉換動作進入無限循環:

     +-----+     +-----+     +-----+ 
         | A | A_to_B/  | B | B_to_C/  | C | 
         |-----| dispatch B_to_C |-----| dispatch C_to_A |-----| 
    O---->|  +------------------->|  +------------------->|  | 
         |  |     |  |     |  | 
         +-----+     +-----+     +-----+ 
         ^        C_to_A/   | 
         |         dispatch A_to_B  | 
         +-----------------------------------------------------+ 
    
  2. 以下機器會立即陷入無限循環通過調度事件進入動作:

     +-------------------+   +-------------------+   +-----+ 
         |   A   |   |   B   |   | C | 
         |-------------------| A_to_B |-------------------| B_to_C |-----| 
    O---->| on entry:   +---------->| on entry:   +---------->|  | 
         | dispatch A_to_B |   | dispatch B_to_C |   |  | 
         |     |   | dispatch C_to_A |   |  | 
         +-------------------+   +-------------------+   +-----+ 
         ^                | 
         |             C_to_A  | 
         +---------------------------------------------------------------+ 
    
+0

我不知道問心無愧是怎麼回事。但是,如果您正在排隊處理事件,那麼最好將進程分隔到不同的處理器/內核中。然後您可以控制每個的優先級。共享內存也可能有用。 –

+0

+用於ASCII繪圖來解釋問題,你如何繪製? –

+1

我使用http://www.asciiflow.com/來繪製這些 – bgr

回答

5

狀態機可以發佈事件自我,但這種有特殊用途,如向上突破再運行完畢(RTC)步入短片。你可能想這樣做是爲了使您否則過長RTC一步之間在系統中的其他狀態機的調度(或更一般的活動對象)。

具體到你的例子,我會盡量避免發佈活動,以自身在這種情況下。通常我會看到人們在將狀態圖與流程圖混淆時執行此操作。狀態圖需要事件從狀態轉換到狀態。在框中指定的計算完成後,流程圖自動從一個處理框轉換到另一個處理框。顯然,當你將事件發佈給自己時,可以將狀態圖變成流程圖。所以,你真的需要一個流程圖,而不是一個狀態圖,因爲你不需要等待任何東西。您繼續全速處理。

你也可以這樣看。事件的目的是向狀態機提供新的信息。這就是狀態機「學習」的方式。但是當你將事件發佈給自己時,你不會獲得任何新知識。您需要的所有知識已經由原來的「真實」事件提供。所以,你有足夠的信息,在短短一個過渡執行所有這些處理,而不是許多「狀態」,這真的是這個漫長的處理階段之間的傳播中。

+1

哇,除了米羅·薩梅克本人之外別人都不會回答!您在UML Statecharts上的材料是不可或缺的,並且在我對這個主題的研究中幫助了我很多。 事實上,這就是爲什麼我最初問,它給我的印象「代碼味道」的等效狀態機。由於我將實施HSM框架,我希望儘可能保持輕量級,但仍然足夠強大。除此之外,我正在設計一個適度複雜的GUI應用程序作爲概念驗證,而我對HSM的缺乏經驗讓我懷疑我是否需要更強大的功能,或者我的設計錯誤:) – bgr