crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> Конечный автомат на Qt, (Qt State Machine Framework)
Litkevich Yuriy
  опции профиля:
сообщение 31.1.2009, 18:53
Сообщение #1


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Нашел в лаборатории у тролей Qt State Machine Framework
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 31.1.2009, 21:13
Сообщение #2


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


Я не совсем понимаю предназначение. В качестве примера там приводится "машина" (замкнутый цикл?) из трех состояний, для кнопки. Жмем первый раз - меняется текст, у кнопки состояние 2, жмем второй раз - снова меняется текст, у кнопки состояние 3. Жмем третий раз - устанавливается первоначальный текст и состояние кнопки 1. Так вот чем это отличается от простого числового параметра у объекта?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 31.1.2009, 23:12
Сообщение #3


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(SABROG @ 1.2.2009, 0:13) *
Так вот чем это отличается от простого числового параметра у объекта?
параметр описывает текущее состояние. Но его можно изменять. И там приведен пример изменения состояния.

Пример удачнее видимо будет на "флажке" (QCheckBox), который имеет три состояния, менятся они могут только поочереди - простой пример конечного автомата.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 1.2.2009, 0:04
Сообщение #4


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


Почитал в инете примеры со строками на эту тему тут, тут и тут, а так и не понял какое преимущество он дает.

Ну, а чем тогда конечный автомат лучше для QCheckBox по сравнению с этим кодом?

    Qt::CheckState state = checkBox1->checkState();
    if (checkBox1->isTristate())
    {
        checkBox1->setCheckState((state+1)%3); //чеким по-кругу 0,1,2,0,1,2...n
    }
    else
    {
        checkBox1->setCheckState(state^Qt::Checked); //xor'им 0 или 2 с 2 (Qt::Checked).
    }

Возможно и не работает, но идея должна быть понятна
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 1.2.2009, 0:14
Сообщение #5


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(SABROG @ 1.2.2009, 3:04) *
Возможно и не работает, но идея должна быть понятна
вот идея как раз не понятна. код нечитаем.
И как он изменится если введем четвертое состояние (неважно зачем)?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 1.2.2009, 0:55
Сообщение #6


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


Цитата(Litkevich Yuriy @ 1.2.2009, 0:14) *
И как он изменится если введем четвертое состояние (неважно зачем)?


Придется всего-лишь поменять 3 на 4.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Antrix
  опции профиля:
сообщение 1.2.2009, 16:23
Сообщение #7


Студент
*

Группа: Новичок
Сообщений: 18
Регистрация: 25.9.2008
Пользователь №: 300

Спасибо сказали: 4 раз(а)




Репутация:   0  


Конечный автомат, это ориентированый граф, который используется для переключения состояний. Вот например ты пишешь игру. У игры есть три состояния:
- bool is GameStart = false; //игра началась
- bool isPause = false; //пауза
- bool is gameEnd = false;//конец игры

Но вот если подумать, то при таком раскладе, возможен вариант, когда все перемены true, тоесть игра началась, и в тоже время пауза, и игра закончилась, что не есть правильно. Так как, тип bool имет 2 состояния true или false, и переменных типа bool у нас 3, то и вариантов комбинаций 3 в квадрате = 9, хатя нам реально нужно всего 3. Что б это исправить, используют конечный автомат - отдельная функция или класс, которая и управляеет переключением состояний.
Первое состояние - игра началась, значит:
- bool is GameStart = true;
- bool isPause = false;
- bool is gameEnd = false;
Второе состояние - пауза:
-- bool is GameStart = false;
- bool isPause = true;
- bool is gameEnd = false;
Третье состояние - конец:
-- bool is GameStart = false;
- bool isPause = false;
- bool is gameEnd = true;
Причем возможны только такие переходы;
игра началась <--> пауза;
игра началась --> конец игры.
Вот хороший пример с лифтом, правда на паскале:
http://books.google.com/books?id=JO9-7Riwl...1&ct=result
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 1.2.2009, 17:11
Сообщение #8


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

Спасибо сказали: 113 раз(а)




Репутация:   23  


Цитата(Antrix @ 1.2.2009, 16:23) *
У игры есть три состояния:
- bool is GameStart = false; //игра началась
- bool isPause = false; //пауза
- bool is gameEnd = false;//конец игры


мне кажется пример, мягко говоря, немного неудачен.
не понятно зачем 3 переменные bool???
если не ошибаюсь чаще используется перечисления

enum EStation {e_NOPALY,e_PLAY,e_PAUSE} m_station;


Раскрывающийся текст
Цитата
Первое состояние - игра началась, значит:
- bool is GameStart = true;
- bool isPause = false;
- bool is gameEnd = false;

m_station = e_PLAY;

Цитата
Второе состояние - пауза:
-- bool is GameStart = false;
- bool isPause = true;
- bool is gameEnd = false;

m_station = e_PAUSE;

Цитата
Третье состояние - конец:
-- bool is GameStart = false;
- bool isPause = false;
- bool is gameEnd = true;

m_station = e_NOPLAY;

что касается Qt State Machine Framework, мне кажется эта штука сгодится только для небольших реализаций как в примере с кнопкой. для сложных машин состояний придется все равно самому реализовывать код...

Сообщение отредактировал kwisp - 1.2.2009, 17:23
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 1.2.2009, 17:19
Сообщение #9


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(kwisp @ 1.2.2009, 20:11) *
мне кажется пример, мягко говоря, немного неудачен.
не понятно зачем 3 переменные bool???
угу

SABROG, найду время приведу реальный пример, на основе Охранно-Пожарного Приемно-Контрольного Прибора (ОП ПКП).
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 1.2.2009, 17:28
Сообщение #10


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

Спасибо сказали: 113 раз(а)




Репутация:   23  


Цитата(Litkevich Yuriy @ 1.2.2009, 17:19) *
.... на основе Охранно-Пожарного Приемно-Контрольного Прибора (ОП ПКП).

:blink:
может что попроще есть???
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 29.3.2024, 11:04