2012-03-05 11 views
2

新しく質問してください。ブーストMSM - 明確に

私はブーストmsmステートマシンを使用したいが、私はそれがどのように動作するか想像するのは苦労している。 2つの状態(s1、s2)があり、s1からs2に行くとすると、イベントe1が起動され、もう一度e2が必要になります。 e1とe2はそれぞれs1とs2内からのみ発火することができます。

main()で私はstatemachine(start())を起動してから、1分ごとにステートマシンに戻りますが、left.i.e.状態が実行を完了したときに

main() 
{ 
MSM.start(); //start state machine 

while (a_condition) 
{ 
ProcessInputsfromIO(); 
Go_backtoStatemachine(); //how can i do this? 
delay(1min) 
} 
MSM.stop(); 
} 

だから、基本的に、ステートマシンは、その後、病気1分の遅延があり、終了します、その後、whileループは、私は私の出口の前にいたの状態に戻って私を取る必要があり、またはIだろうそれが状態マシンを実装する方法だと思います。

私は普通のことを求めていますか?はいの場合、人々はどのようにノンブロッキング状態マシンを実装しますか?いいえの場合は、どうすればGo_backtoStatemachine()を実装できますか?

答えて

1

そこはかなり単純な例はここにある:

MSM Simple Tutorial

state machineは抽象的な概念です。 Boost MSMの枠組みの中では、process_event()のイベントを注入するためにstart()と呼び、を停止するように呼び出すことができます。ステートマシンは単にシステムステートをキャプチャし、システムがステートを変更するといくつかの関数を呼び出すことができます。どのように使用するかはアプリケーションに非常に依存します。

+0

私は状態を終了し、init状態を経ずに再入力する方法はありませんか? – Kam

+0

@ user1248779:状態とバックの間を移動することができます。また、ステートマシンを同じ状態に留めるイベントもあります。あなたはちょうど良い遷移テーブルを持っている必要があります。例を少し慎重に勉強してください。例えば。停止した状態で停止イベントが発生すると、停止状態に留まります。 open_closeイベントを取得し続けると、Empty状態とOpen状態間を連続的に遷移します。 –

+0

ガイ、あなたが何か私はこれを感謝しているか分かりませんあなたの助けに感謝します。しかし、たぶん私は自分自身を適切に説明しなかったかもしれない。ステート間を移動したり、同じステートに留まっていても、ステートマシンを終了することはありません。しかし、私が状態S1にいるとしましょう、私はS1から出て、基本的に状態マシンから出ますが(私はそれを止めません)、私が状態マシンに再び入ることができる唯一の方法はイベントを発射することです。だから私が状態テーブルを正しく設計すると、おそらく病気を同じ状態に戻すすべての状態にイベントを追加し、whileループの終わりにそのイベントを呼び出すだけですか? – Kam