Russian Qt Forum

Программирование => С/C++ => Тема начата: Денис от Ноябрь 10, 2014, 13:58



Название: [РЕШЕНО] HSM - интересное решение !? Но как обычно Trable !)
Отправлено: Денис от Ноябрь 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, по мне это дублирование или я чего-то не понимаю ?


Название: Re: HSM - интересное решение !? Но как обычно Trable !)
Отправлено: Денис от Ноябрь 10, 2014, 14:23
Как я понял START_EVT нужно для входа в подсостояние, тобишь State *next ...
Если мы хотим сменить состояние, то воспользоваться STATE_TRAN() ...
А если я хочу выйти ?, нужно что воспользоваться HsmExit_(), но в модели она защищенная, программирую сейчас для C ... пидскажить ?)


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

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


Название: Re: HSM - интересное решение !? Но как обычно Trable !)
Отправлено: Денис от Ноябрь 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) и все ... или как ?


Название: Re: HSM - интересное решение !? Но как обычно Trable !)
Отправлено: vulko от Ноябрь 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 не совсем то же самое.


Название: Re: HSM - интересное решение !? Но как обычно Trable !)
Отправлено: Денис от Ноябрь 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 - состояние главное состояние, это типа в случае какой-то ошибки страшной )))
То есть по сути она в большей части работы программы не нужна ... Вроде так, поправь если считаешь по другому ?


Название: Re: HSM - интересное решение !? Но как обычно Trable !)
Отправлено: vulko от Ноябрь 11, 2014, 09:39
Документация очень понятная вроде, хотя я ей всю и не читал, только пробежал взглядом.
Если есть проблемы с пониманием того как оно работает, может лучше написать свою реализацию? Тут всего ничего кода то...
Зато отпадут вопросы о том что и как делать...

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

Т.е. первое только один раз в начале, второе при переходе в след. состояние.


Название: Re: HSM - интересное решение !? Но как обычно Trable !)
Отправлено: Денис от Ноябрь 11, 2014, 12:53
Проблема в понимании как раз использования START и TRAN, и генерируются какие события при этом ENTRY, START и т.д. Менеждер состояний реализован же по какому-то стандарту ? Где про него можно почитать не в курсе ?


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

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


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

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


Название: Re: HSM - интересное решение !? Но как обычно Trable !)
Отправлено: Денис от Ноябрь 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 - для всего остального )
Просто надо было разобраться, есть код написанный с помощью этого менеджера состояний ))))))