2012-03-05 2 views
2

новыйbi вопрос пожалуйста, голый со мной как Im борющийся с этим.Boost MSM - очиститель

Я хочу использовать форматированный автомат msm, но мне трудно представить, как это работает. Скажем, у нас есть только 2 состояния (s1, s2) и перейти от s1 в s2, вам нужно запустить событие e1, и вам нужно еще один e2. e1 и e2 могут быть запущены только из s1 и s2 соответственно.

Теперь в основном() Я начинаю с запуска statemachine (start()), тогда у больного есть цикл while, который каждые 1 мин возвращается на конечный автомат, но должен забирать с того места, где он остался.i.e.

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

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

Так в основном, когда государство завершает выполнение, то StateMachine выйдет, то больной имеет задержку в 1 мин, после чего цикл в то время как нужно будет принять меня обратно в состояние я был до I съезда, или я подумайте, что мы должны реализовать государственную машину.

Является ли то, что я прошу, необычно? Если да, то как люди реализуют неблокирующий конечный автомат? если нет, то как я могу реализовать Go_backtoStatemachine()?

ответ

1

Существует довольно простой пример здесь:

MSM Simple Tutorial

state machine является абстрактным понятием. У него есть состояния, события и т. Д. На самом деле у него нет концепции блокировки, не блокировки и т. Д. В рамках Boost MSM вы можете позвонить start(), чтобы ввести начальное состояние, process_event() для ввода событий, и stop() для остановки. Государственный аппарат просто захватывает состояние системы и может вызывать некоторые функции по мере изменения состояния системы. Как вы будете использовать, это очень зависит от приложения.

+0

Итак, у меня нет способа выйти из состояния, а затем повторно войти в него, не пройдя через состояние init? – Kam

+0

@ user1248779: Вы можете перемещаться между любым состоянием и обратно, а также иметь событие, чтобы конечный автомат оставался в одном состоянии. Вам просто нужно иметь правую таблицу перехода. Изучите пример немного более тщательно. Например. когда вы получаете событие остановки в остановленном состоянии, вы остаетесь в состоянии остановки. Когда вы продолжаете получать событие open_close, вы будете переключаться между состояниями Empty и Open - непрерывно. –

+0

Парень, благодарю вас за помощь, вы не представляете, насколько я ценю это. Но, может быть, я не объяснил себя должным образом. Перемещение между состояниями и даже пребывание в одном и том же состоянии не проблема, если я никогда не выхожу из конечного автомата. Но допустим, что я состою в состоянии S1, и я выхожу из S1 и в основном выхожу из конечного автомата (но я не останавливаю его), единственный способ, которым я могу вернуться на конечный автомат, - это запустить событие. Итак, если я правильно оформляю таблицу состояний, возможно, я добавлю событие в каждое состояние, которое вернет вас в одно и то же состояние, а в конце моего цикла while просто вызовет это событие? – Kam

Смежные вопросы