提升MSM - 更清晰

时间:2012-03-05 00:40:15

标签: c++ boost boost-msm

newbi问题随我而生,因为我在努力解决这个问题。

我想使用boost msm状态机,但我很难想象它是如何工作的。假设我们只有2个状态(s1,s2),并且从s1到s2你需要事件e1被解雇,然后你需要另外一个e2。 e1和e2只能分别从s1和s2中触发。

现在在main()中我开始启动statemachine(start())然后生病了一个while循环,每1分钟将返回状态机,但必须从它离开的地方拿起。我

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()?

2 个答案:

答案 0 :(得分:1)

这里有一个相当简单的例子:

MSM Simple Tutorial

state machine是一个抽象概念。它有状态,事件等。它实际上没有阻塞,非阻塞等概念。在Boost MSM的框架内,你可以调用start()进入初始状态process_event()来注入事件,并stop()停止。状态机简单地捕获系统状态,并且可以在系统改变状态时调用某些功能。你将如何使用它取决于应用程序。

答案 1 :(得分: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() 将处理所有排队的事件 (按先进先出顺序)。调用 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()