4

Boost msmステートマシンを使用したいのですが、それがどのように機能するか想像するのに苦労しています。状態が2つ(s1、s2)しかない場合、s1からs2に移動するには、イベントe1を起動する必要があり、元に戻すには、別のe2が必要です。e1とe2は、それぞれs1とs2内からのみ起動できます。

ここでmain()で、ステートマシン(start())を起動することから始めます。その後、1分ごとにステートマシンに戻るが、離れた場所からピックアップする必要があるwhileループがあります。

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

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

したがって、基本的に状態の実行が終了すると、ステートマシンが終了し、1分の遅延が発生します。その後、whileループを使用して、終了前の状態に戻す必要があります。これを実装する方法だと思います。ステートマシン。

私が求めているのは異常なことですか?はいの場合、人々はどのように非ブロッキングステートマシンを実装しますか?いいえの場合、Go_backtoStatemachine()を実装するにはどうすればよいですか?

4

2 に答える 2

3

ここにかなり簡単な例があります:

MSMの簡単なチュートリアル

ステートマシンは抽象的な概念です。状態、イベントなどがあります。実際には、ブロッキング、非ブロッキングなどの概念はありません。BoostMSMのフレームワーク内でstart()、初期状態に入り、process_event()イベントを挿入し、stop()停止するために呼び出すことができます。ステートマシンは単にシステムの状態をキャプチャし、システムが状態を変更するときにいくつかの関数を呼び出すことができます。どのように使用するかは、アプリケーションによって大きく異なります。

于 2012-03-05T01:15:58.387 に答える
0

MSMはスレッドに関する知識を持っていないため、start()またはprocess_event(MyEvent())が呼び出されると、現在のスレッドで実行されます。ドキュメント( https://www.boost.org/doc/libs/1_75_0/libs/msm/doc/)で説明されているように、イベント処理を後で延期することは可能です(これはまだスレッドセーフではありません) 。 HTML / ch03s05.html#d0e2668):

後で処理するためにイベントをキューに入れる

process_event(Event const&)を呼び出すと、実行から完了までのセマンティクスでイベントがすぐに処理されます。代わりにenqueue_event(Event const&)を呼び出すことで、イベントをエンキューして処理を遅らせることもできます。次に、execute_queued_events()を呼び出すと、キューに入れられたすべてのイベントが(FIFO順に)処理されます。execute_single_queued_event()を呼び出すと、キューに入れられた最も古いイベントが実行されます。

get_message_queue_size()を呼び出すことにより、キューサイズを照会できます。

質問の例では、次のことができます

  1. ProcessInputsfromIO内のイベントを次のようにキューに入れます
void ProcessInputsfromIO(){
    somethingToDo();
    myfsm.enqueue_event(myEvent1());
    somethingElseToDo();
    etc();
}
  1. Go_backtoStatemachine()は単にmyfsm.execute_queued_events()になります
于 2021-02-17T12:52:50.257 に答える