2013-03-21 49 views
0

我一直在使用boost的異步狀態圖來編寫程序。在這個程序中,我使用異步串行端口與其他設備進行通信。我有一個狀態,通過串口等待設備確認,然後發佈「收到確認」事件。這很好,但我也想實現一個「超時」事件。boost :: statechart ---發佈「serial timeout」事件

在以前的程序中,我一直在爲我的狀態機使用switch case語句,我的代碼可以在每次循環運行時運行。這意味着我可以運行代碼並檢查是否應該由於某些事情超時而改變狀態。像這樣:

while(1){ 
    switch (state){ 
     case 0:{ 
      sendMessage(); 
      state = 1; 
      sendTime = boost::chrono::steady_clock::now(); 
     } 
     break; 
     case 1:{ 
      if (isConfirmationReceived()){ 
       // do something 
       state = 2; 
      } 
      else if (boost::chrono::steady_clock::now() > sendTime + boost::chrono::duration<double>(WAIT_LENGTH)){ 
       //raise a time out error 
       state = 3; 
      } 
     } 
     break; 
     // etc etc 

    } 
} 

我該如何使用boost :: StateChart實現類似這樣的事情?我應該考慮這個完全不同的方式嗎?

回答

0

我不知道這是否是最佳做法,但我通過定期發送我的SM EvTick事件(1ms或某事)並處理超級狀態中的事件來解決此問題。您還可以添加ClearTimeout() SetTimeout()DisableTimeout()成員函數和訪問他們像這樣:

context<TimeoutSuperState>().SetTimeout(1000); 

可以讓超狀態過渡到超時錯誤狀態或張貼EvOnTimeout到可以不同,這取決於狀態下處理的SM。