Russian Qt Forum
Май 02, 2024, 13:24 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: [РЕШЕНО] HSM - интересное решение !? Но как обычно Trable !)  (Прочитано 4908 раз)
Денис
Гость
« : Ноябрь 10, 2014, 13:58 »

Предисловие HSM - Hierarhical State Machine ... с буржуйского иерархический конечный автомат )
В общем есть паттерн от Миро Самека, так вот не понятно назначение некоторых функция диспечера сообытий ... можете помочь, кто с ним работал ? Тема довольно интересна и частичто с ней разобрался, но есть подводные камни !!!
Вот ссылка: http://www.state-machine.com/resources/samek0008.pdf
К примеру ничерта не понятено зачем нужна функция HsmToLCA_() и HsmExit_() ?
И еще не понятна таблица трассировки или как там она entryPath ?
Методы обмена сообщениями не понятно назначение сообытия start_evt если есть entry_evt для инициализации состояния ?
Помогите плз, 2 дня уже бьюсь !

Как я понял HsmToLCA_ нужна для списка предков, но не понятен механизм как она ищет предков, запутался ... И зачем событие START_EVT если есть ENTRY_EVT, по мне это дублирование или я чего-то не понимаю ?
« Последнее редактирование: Ноябрь 11, 2014, 15:57 от Денис » Записан
Денис
Гость
« Ответ #1 : Ноябрь 10, 2014, 14:23 »

Как я понял START_EVT нужно для входа в подсостояние, тобишь State *next ...
Если мы хотим сменить состояние, то воспользоваться STATE_TRAN() ...
А если я хочу выйти ?, нужно что воспользоваться HsmExit_(), но в модели она защищенная, программирую сейчас для C ... пидскажить ?)
Записан
vulko
Гость
« Ответ #2 : Ноябрь 10, 2014, 14:41 »

Как я понял START_EVT нужно для входа в подсостояние, тобишь State *next ...
Если мы хотим сменить состояние, то воспользоваться STATE_TRAN() ...
А если я хочу выйти ?, нужно что воспользоваться HsmExit_(), но в модели она защищенная, программирую сейчас для C ... пидскажить ?)

судя по "FIGURE 1 Structure of HSM design pattern" подразумевается что будет создана собственная имплементация (ConcreteHSM) и вызов protected функционала не будет проблемой.
Записан
Денис
Гость
« Ответ #3 : Ноябрь 10, 2014, 14:54 »

Как я понял START_EVT нужно для входа в подсостояние, тобишь State *next ...
Если мы хотим сменить состояние, то воспользоваться STATE_TRAN() ...
А если я хочу выйти ?, нужно что воспользоваться HsmExit_(), но в модели она защищенная, программирую сейчас для C ... пидскажить ?)

судя по "FIGURE 1 Structure of HSM design pattern" подразумевается что будет создана собственная имплементация (ConcreteHSM) и вызов protected функционала не будет проблемой.

Хорошо, а как тогда правильно выйти из состояния ? HsmExit_(HsmtoLCA()) ... или я так понимаю их по примеру и использовать нет необходимости, нужно просто в определенный момент воспользоваться STATE_TRAN(me,target) и все ... или как ?
Записан
vulko
Гость
« Ответ #4 : Ноябрь 10, 2014, 15:52 »

Как я понял START_EVT нужно для входа в подсостояние, тобишь State *next ...
Если мы хотим сменить состояние, то воспользоваться STATE_TRAN() ...
А если я хочу выйти ?, нужно что воспользоваться HsmExit_(), но в модели она защищенная, программирую сейчас для C ... пидскажить ?)

судя по "FIGURE 1 Structure of HSM design pattern" подразумевается что будет создана собственная имплементация (ConcreteHSM) и вызов protected функционала не будет проблемой.

Хорошо, а как тогда правильно выйти из состояния ? HsmExit_(HsmtoLCA()) ... или я так понимаю их по примеру и использовать нет необходимости, нужно просто в определенный момент воспользоваться STATE_TRAN(me,target) и все ... или как ?

HsmExit_ судя по докам выходит из всех состояний HSM вплоть до LCA.
STATE_TRAN не совсем то же самое.
Записан
Денис
Гость
« Ответ #5 : Ноябрь 10, 2014, 16:00 »

Как я понял START_EVT нужно для входа в подсостояние, тобишь State *next ...
Если мы хотим сменить состояние, то воспользоваться STATE_TRAN() ...
А если я хочу выйти ?, нужно что воспользоваться HsmExit_(), но в модели она защищенная, программирую сейчас для C ... пидскажить ?)

судя по "FIGURE 1 Structure of HSM design pattern" подразумевается что будет создана собственная имплементация (ConcreteHSM) и вызов protected функционала не будет проблемой.

Хорошо, а как тогда правильно выйти из состояния ? HsmExit_(HsmtoLCA()) ... или я так понимаю их по примеру и использовать нет необходимости, нужно просто в определенный момент воспользоваться STATE_TRAN(me,target) и все ... или как ?

HsmExit_ судя по докам выходит из всех состояний HSM вплоть до LCA.
STATE_TRAN не совсем то же самое.

Ну как я понял STATE_START для входа в подсостояние, STATE_TRAN - для перехода в другое состояние (уровнем выше или в другую иерархию состояний), HsmExit_() - выход из всех подсостояний и переход на top - состояние главное состояние, это типа в случае какой-то ошибки страшной )))
То есть по сути она в большей части работы программы не нужна ... Вроде так, поправь если считаешь по другому ?
« Последнее редактирование: Ноябрь 10, 2014, 23:59 от Денис » Записан
vulko
Гость
« Ответ #6 : Ноябрь 11, 2014, 09:39 »

Документация очень понятная вроде, хотя я ей всю и не читал, только пробежал взглядом.
Если есть проблемы с пониманием того как оно работает, может лучше написать свою реализацию? Тут всего ничего кода то...
Зато отпадут вопросы о том что и как делать...

STATE_START стартует автомат. Т.е. он из псевдосостояния переходит в начальное состояние.
STATE_TRANS переходит в следущее состояние.

Т.е. первое только один раз в начале, второе при переходе в след. состояние.
Записан
Денис
Гость
« Ответ #7 : Ноябрь 11, 2014, 12:53 »

Проблема в понимании как раз использования START и TRAN, и генерируются какие события при этом ENTRY, START и т.д. Менеждер состояний реализован же по какому-то стандарту ? Где про него можно почитать не в курсе ?
Записан
vulko
Гость
« Ответ #8 : Ноябрь 11, 2014, 13:50 »

Проблема в понимании как раз использования START и TRAN, и генерируются какие события при этом ENTRY, START и т.д. Менеждер состояний реализован же по какому-то стандарту ? Где про него можно почитать не в курсе ?

Там же есть код.
Впрочем код конечно ппц... написано идиотом, который считает себя гением видимо.
Я бы за одни названия методов и переменных уши бы обрывал таким шкодерам.
Что это, мать его, за exit_(), нахрена state_start в виде метода, а state_trans макросом... жесть какая-то.


Ещё раз глянул супер код...
Сперва делаешь STATE_START(State *target), он задает next = target. А потом STATE_TRANS(currentState), видимо...

Короче мой добрый совет тебе - выкини эту х**ту и напиши нормальный код, не парь себе мозг.
Записан
Денис
Гость
« Ответ #9 : Ноябрь 11, 2014, 15:54 »

Проблема в понимании как раз использования START и TRAN, и генерируются какие события при этом ENTRY, START и т.д. Менеждер состояний реализован же по какому-то стандарту ? Где про него можно почитать не в курсе ?

Там же есть код.
Впрочем код конечно ппц... написано идиотом, который считает себя гением видимо.
Я бы за одни названия методов и переменных уши бы обрывал таким шкодерам.
Что это, мать его, за exit_(), нахрена state_start в виде метода, а state_trans макросом... жесть какая-то.


Ещё раз глянул супер код...
Сперва делаешь STATE_START(State *target), он задает next = target. А потом STATE_TRANS(currentState), видимо...

Короче мой добрый совет тебе - выкини эту х**ту и напиши нормальный код, не парь себе мозг.

Действительно названия меня в ступор и вводили, где входы где выходы.
Вообщем разобрался ... Смотри если интересно, при входе в главное супер состояние TOP вызываем STATE_START для создания иерархического состояния (допустим WHATISFUCK), внутреннего ... Далее если в TOP есть еще подсостояния NEWISFUCK, кроме WHATISFUCK, для перехода к нему используем STATE_TRANS, а если хотим войти в подсостояние WHATISFUCK, то опять метод STATE_START ... То есть метод STATE_START для входа в подсостояния, иерархически ... Если нужно выйти или войти в подсостояние NEWISFUCK, то опять STATE_TRANS ...
Вообщем STATE_START для входа во внутреннее состояние, а STATE_TRANS - для всего остального )
Просто надо было разобраться, есть код написанный с помощью этого менеджера состояний ))))))
« Последнее редактирование: Ноябрь 11, 2014, 15:56 от Денис » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.054 секунд. Запросов: 21.