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()?
答案 0 :(得分:1)
这里有一个相当简单的例子:
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() 来查询队列大小。
在问题的例子中,你可以
void ProcessInputsfromIO(){
somethingToDo();
myfsm.enqueue_event(myEvent1());
somethingElseToDo();
etc();
}