2012-03-05 69 views
2

newbi问题请与我一起裸露,因为我正在努力与此。提升男男性接触者 - 更清晰

我想使用boost msm状态机,但我很难想象它是如何工作的。假设我们只有2个状态(s1,s2),并且从s1到s2,则需要触发事件e1,并返回您需要的另一个e2。 e1和e2只能分别在s1和s2内被触发。我开始启动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(); 
} 

所以基本上时的状态完成执行后,的statemachine将退出,然后生病了1分钟的延迟,那么while循环将要带我回到我之前,我退出的状态,还是我认为这就是我们应该如何实现一个状态机。

我在寻求什么与众不同的东西?如果是,那么人们如何实现一个非阻塞状态机器?如果不是,那我怎么能实现Go_backtoStatemachine()?

回答

1

这里有一个很简单的例子:

MSM Simple Tutorial

一个state machine是一个抽象的概念。它具有状态,事件等。它并没有真正的阻塞,非阻塞等概念。在Boost MSM框架内,您可以拨打start()进入初始状态,process_event()注入事件,stop()停止。状态机只是捕获系统状态,并可以在系统改变状态时调用某些功能。你将如何使用它是非常依赖于应用程序的。

+0

那么我没有办法让我退出一个状态,然后在不经过初始状态的情况下重新进入状态? – Kam 2012-03-05 02:07:13

+0

@ user1248779:您可以在任何状态和回退之间移动,也可以让事件使状态机保持相同的状态。你只需要有正确的转换表。仔细研究一下这个例子。例如。请注意,当您在停止状态中停止事件时,您仍处于停止状态。当你不断收到open_close事件时,你将在空和打开状态之间转换 - 不断。 – 2012-03-05 02:41:12

+0

家伙,谢谢你的帮助,你不知道我有多赞赏这个。但也许我没有正确解释自己。如果我从不退出状态机,在状态之间移动并保持相同的状态是没有问题的。但假设我处于状态S1,并且我从S1退出并基本从状态机退出(但我不停止它),唯一可以重新进入状态机的方式是通过触发一个事件。所以如果我正确设计状态表,也许我会添加一个事件给每个状态,让你回到相同的状态,并在我的while循环结束时生病只是调用该事件? – Kam 2012-03-05 03:11:14