Конечный автомат на Qt, (Qt State Machine Framework) |
Здравствуйте, гость ( Вход | Регистрация )
Конечный автомат на Qt, (Qt State Machine Framework) |
Antrix |
1.2.2009, 17:33
Сообщение
#11
|
Студент Группа: Новичок Сообщений: 18 Регистрация: 25.9.2008 Пользователь №: 300 Спасибо сказали: 4 раз(а) Репутация: 0 |
Возможно пример неудачен, ну я старался объснить как мог . А с переменными bool я думал будет легче понять.
|
|
|
Litkevich Yuriy |
1.2.2009, 18:04
Сообщение
#12
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
вообще любой пример не удачен, если все состояния в нем изменяются последовательно.
Нематематическое, а электрощиско-практическое определение: Конечный автомат (КА) - автомат выходной сигнал которого (читай его состояние) зависит от текущего входного сигнала и текущего состояния КА (можно представить в виде предыстории его входных сигналов) Пожарный шлейф сигнализации (ШС) обладает такими свойствами: 1) снят с ошраны 2) на охране 3) сигнал (состояние) "Внимание" 4) сигнал (состояние) "Пожар" 5) постановка в движении Обычно пожарные ШС - круглосуточные, т.е. их нельзя снять с охраны (человек нажимает кнопку "Снять с охраны"). вместо снятия с охраны для любых круглосуточных (как пожарных так и охранных ШС) осуществляют "перепостановку". При перепостановке снимается питание с ШС и с линий питаний датчиков, чтобы сброить их состояние. Затем подается питание, с этого момента состояние ШС = №5 (постановка в движении), нужно для установления рабочих режимов датчиков. т.е. 6) перепостановка (переход в сост. №1 и последующий автоматический переход в состояние №5) И работа КА выглядит так: Подаем питание прибора, в КА поступает входной сигнал "Поставить на охрану" тогда КА переходит в состояние №5, по истечении некоторого времени КА переходит в одно из состояний №2 или №3 или №4 Из состояния №2 может перейти в №6 или №3 или №4 Из состояния №3 может перейти в №6 или №4 Из состояния №4 может перейти в №6 Т.е. состояния непоследовательные --- Написал наспех может чего пропустил |
|
|
kwisp |
1.2.2009, 18:11
Сообщение
#13
|
астарожна ынтжинэр Группа: Участник Сообщений: 1404 Регистрация: 26.11.2008 Из: ТаганрогРодинаЧехова Пользователь №: 435 Спасибо сказали: 113 раз(а) Репутация: 23 |
Litkevich Yuriy,
Цитата вообще любой пример не удачен, если все состояния в нем изменяются последовательно. в любом наборе. а пример с кнопкой в Qt State Machine Framework как раз такой. нужно попробовать реализовать "простой" пример, состояний 5 хотя бы с запрещенными переходами непоследовательный может быть не с одним уровнем истории состояний своим (у каждого наверное свой) методом и способом который предлагает Qt State Machine Framework тогда станет все наглядно ясно. Сообщение отредактировал kwisp - 1.2.2009, 18:12 |
|
|
Litkevich Yuriy |
1.2.2009, 18:18
Сообщение
#14
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
а пример с кнопкой в Qt State Machine Framework как раз такой а там как раз во 2 коментарии сказано о не удачности примерамне собственно стало интересно как они реализовали работу с КА: Т.е. реализовано добавление переходов (addTransition) и используются сигналы, такое мне в голову не приходило.Эту штуку можно использовать в программах опрашивающих разные устройства, например, на шине ModBas |
|
|
Tonal |
2.2.2009, 15:25
Сообщение
#15
|
Активный участник Группа: Участник Сообщений: 452 Регистрация: 6.12.2007 Из: Новосибирск Пользователь №: 34 Спасибо сказали: 69 раз(а) Репутация: 17 |
Почитал в инете примеры со строками на эту тему тут, тут и тут, а так и не понял какое преимущество он дает. Ну, а чем тогда конечный автомат лучше для QCheckBox по сравнению с этим кодом?
Возможно и не работает, но идея должна быть понятна Этот код - тот же конечный автомат только запрограммированный через if-ы. Конечный автомат - это способ (математический формализм) для описаия поведения некоторой системы через состояния и переходы между ними. Конечным автоматом можно описать поведения GUI программы, работу с устройством, сетевым протоколом, разбор текстового файла... Те же регулярные выражения реализуются через конечные автоматы - строка регэкспа разбирается, по ней строится КА (конечный автомат), после чего через него пропускается поток символов - каждый символ - событие, переводящее КА в какое-то состояние. Так что вопрос "что лучше" тут бессмысленен. Если научится работать с КА и находить их в задачах, то будет проще работать. |
|
|
SABROG |
2.2.2009, 15:45
Сообщение
#16
|
Профессионал Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: 34 |
Видимо if'ы обеспечивают как раз тот механизм "непоследовательности" автомата, в то время как операция взяти по модулю - последовательное выполнение.
|
|
|
Litkevich Yuriy |
2.2.2009, 15:58
Сообщение
#17
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
вообще чаще используют переключатель:
примерно так
|
|
|
kuzulis |
20.4.2010, 19:56
Сообщение
#18
|
Активный участник Группа: Участник Сообщений: 393 Регистрация: 29.6.2009 Пользователь №: 862 Спасибо сказали: 36 раз(а) Репутация: 7 |
ООО!!! Хоть тема и старая, но подниму... Наткнулся на нее и свои 5 копеек добавлю.
Цитата вообще чаще используют переключатель: Дадада.. Именно! Есть такая штука - как SWITCH технология программирования в которой и используется такой подход. Чаще всего оно применяется в автоматике, АСУТП, при программировании ПЛК и т.п. В инете оч много литературы по этому поводу (кратко ознакомится на википедии можно). Этот подход очень удобен, но необычен для основного контингента программистов, которые привыкли думать "классически". Этот подход в сложных алгоритмах со множеством состояний избавляет нас от большого кол-ва ошибок, позволяя делить алгоритм на несколько КА по вложенности и т.п. Как я к примеру делаю: 1. Делю алгоритм на различные КА, выполняющие определенные функции 2. Для каждого КА рисую граф переходов 3. По графу пишу программу При этом каждый КА имеет у меня набор свойств: 1. Набор состояний 2. Набор входных воздействий И в зависимости от текущего воздействия на автомат и его состояния выполняется некий алгоритм, который переводит КА в другие состояния и т.п. В общем, все оч просто и удобно. Я сам нечто похожее делаю для ПЛК (правда к Qt4 это никоим образом не относится)... Результаты - впечатляют! Ошибок по сравнению с "классикой" гораздо меньше и код гораздо понятнее и читабельней! |
|
|
Анна |
18.12.2017, 17:31
Сообщение
#19
|
Активный участник Группа: Участник Сообщений: 276 Регистрация: 22.5.2008 Из: Зеленоград Пользователь №: 181 Спасибо сказали: 30 раз(а) Репутация: 4 |
Вот сейчас читаю про паттерн "Состояние".
В принципе, это то, что мне надо. При срабатывании QAction программа переходила бы в то или иное состояние, в которых по-разному реагировала бы на срабатывания других QAction (например, некоторые действия должны игнорироваться при одном состоянии и выполняться при другом). Но вот как увязать описанный в книге паттерн с классами QState и QStateMachine представить не могу. Может, кто подскажет? Книжные примеры брала у Э.Фримен и Э.Фримен "Паттерны проектирования" и Гамма, Хельм, Джонсон и Влиссидес "Приёмы объектно-ориентированного проектирования" |
|
|
Litkevich Yuriy |
10.1.2018, 22:33
Сообщение
#20
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
Но вот как увязать описанный в книге паттерн с классами QState и QStateMachine представить не могу. Я про этот патерн не читал.Один из вариантов использования QStateMachine выглядит примерно так: Сначала описываем сам автомат (без описания полезной работы)
Далее/ранее по коду создаём слоты которые выполняются при входе в соответствующее состояние
Ну а QAction умеет посылать сигналы. П.С. Выдрано как попало из реального кода Сообщение отредактировал Litkevich Yuriy - 10.1.2018, 22:39 |
|
|
Текстовая версия | Сейчас: 12.12.2024, 10:37 |