Название: Автомат, или фиксированная последовательность. Как? Отправлено: Bepec от Февраль 20, 2012, 15:28 Приветствую заглянувших.
Имеется чёткая последовательность состояний устройства при его подключении. Задача - вклиниться в любой из этих этапов и продолжить (возможно изменять чуть чуть, возможно просто снифферить) последовательность инициализации. Ещё проще - есть 8 состояний. И их нужно пройти от n до 8. Кто-то из старожилов в одной теме, упоминал QStateMashine. Собственно вопрос: Можно ли это реализовать в Qt, каким классом. (В идеале ещё и примерчик ;) ) update: Да, я могу это реализовать просто свичами, но это неудобно и путанно. Название: Re: Автомат, или фиксированная последовательность. Как? Отправлено: Igors от Февраль 20, 2012, 16:28 Bepec, возможно Ваша тема интересна, но как Вы ее сформулировали - скорее всего она опять свалится в перепалку между Вами и Андрюшкой.
Задача - вклиниться в любой из этих этапов и продолжить (возможно изменять чуть чуть, возможно просто снифферить) последовательность инициализации. Что значит "вклиниться" и чего изменять "чуть-чуть"? Также у меня весьма смутное понятие о "снифферах" (что-то с вебом?). Зачем раздражать людей такими мутными формулировками? Поясните на живом примере, подробно. Не тратьте свое и чужое время на наводящие вопросы и ответы.Название: Re: Автомат, или фиксированная последовательность. Как? Отправлено: Bepec от Февраль 20, 2012, 17:59 Поясняю. Далее по тексту написано - Ещё проще. Вот с этого момента читайте.
Есть 8 состояний. Например: 1 Идентификация - отзыв 2 Вторичная идентификация - отзыв 3 Начало общения - подтверждение 4 Запрос данных - данные 5 */* 6 */* 7 */* 8 Конец общения - подтверждение. Как это перехватывается и почкуется - моя забота. Что нужно? Нужно чтобы можно было запустить последовательность с любого пункта. С 1 или с 5, или с 7. Название: Re: Автомат, или фиксированная последовательность. Как? Отправлено: mutineer от Февраль 20, 2012, 18:19 Эти состояния в QStateMachine или где?
Название: Re: Автомат, или фиксированная последовательность. Как? Отправлено: Bepec от Февраль 21, 2012, 06:55 Это состояния в устройстве.
номер п/п Посылаемая команда(состояние устройства) Отклик от устройства 1 Идентификация - отзыв Собственно я и спрашиваю, возможно ли это реализовать, и есть какой - либо класс для реализации этой последовательности. Возможно ли запихнуть эти 8 состояний в QStateMachine, а потом вызывать с любого этапа в вышеизложенном порядке? Название: Re: Автомат, или фиксированная последовательность. Как? Отправлено: ecspertiza от Февраль 21, 2012, 08:26 Я конечно нифига не понял :) Но как вариант может тебе обычная очередь подойдет QQueue
Название: Re: Автомат, или фиксированная последовательность. Как? Отправлено: Bepec от Февраль 21, 2012, 08:44 Очередь это конечно интересно, но... Чуть не подходит (ибо ничем не отличается от 8 связанных функций).
Проще говоря - Нужно выполнить 8 функций подряд. Причём с указанием с какой функции начинать, аля Код: callFunctions(4); В дальнейшем таких последовательностей функций будет до крыши (от 10 и выше). Всё ещё непонятно? Пытаюсь совсем упростить. Пример последовательностей: Кинуть.
И необходимо, чтобы можно было вызвать последовательность с любого этапа, аля: Код: if (Камень уже есть в руках) Количество последовательностей в дальнейшем будет расти, аля 1. Кинуть. 2. Плюнуть 3. Уронить. 4. Поднять. Потому хочется узнать, есть ли спец контейнер для таких вещей? (Как меня просветили железячники, конструкция эта - жёсткий автомат) Название: Re: Автомат, или фиксированная последовательность. Как? Отправлено: Kurles от Февраль 21, 2012, 09:15 Можно сделать через указатели на функции и любой из контейнеров, кот. тебе удобней. Например:
Код that is all :) update: через QStateMachine сделать можно, но будет еще более неудобно и путано, чем через switch'и. Название: Re: Автомат, или фиксированная последовательность. Как? Отправлено: ecspertiza от Февраль 21, 2012, 09:28 аке, а что мешает создать очередь ф-ций ? :)
Код: #include <QCoreApplication> Kurles, опередил ;) Название: Re: Автомат, или фиксированная последовательность. Как? Отправлено: Bepec от Февраль 21, 2012, 09:30 Печально. Придётся тогда свой собственный клас написать чоле. А то 5-10 разнообразных списков... Это конечн что-то ;)
Спасибо большое всем отписавшимся. ОГРОМНЕЙШЕЕ спасибо andrew.k, что не заходил в эту тему ;) update to ecspertiza: 10+ последовательностей, самая маленькая - 8 функций. Каждый раз в очередь пихать - интересно, но маловнятно. Создать 10+ очередей - интересно, но как тогда вызывать пятый элемент последовательности? :P Название: Re: Автомат, или фиксированная последовательность. Как? Отправлено: Kurles от Февраль 21, 2012, 09:36 10+ последовательностей, самая маленькая - 8 функций. Каждый раз в очередь пихать - интересно, но маловнятно. Создать 10+ очередей - интересно, но как тогда вызывать пятый элемент последовательности? :P Название: Re: Автомат, или фиксированная последовательность. Как? Отправлено: Bepec от Февраль 21, 2012, 09:43 Конечно видел ;) Даже прочитал!
Цитировать Печально. Придётся тогда свой собственный клас написать чоле. А то 5-10 разнообразных списков... Это конечн что-то ;) Собственно прихожу к мнению, что необходимо свой класс накалякать, и там как раз будет 1 большоооой вектор с указателями :) Название: Re: Автомат, или фиксированная последовательность. Как? Отправлено: ecspertiza от Февраль 21, 2012, 09:56 update to ecspertiza: 10+ последовательностей, самая маленькая - 8 функций. Каждый раз в очередь пихать - интересно, но маловнятно. Создать 10+ очередей - интересно, но как тогда вызывать пятый элемент последовательности? :P Тут тебе тогда больше вариант Kurles подойдет. Насколько я понял у тебя несколько последовательностей, у каждой по несколько ф-ций. Тогда можно создать вектор что то типа QVector< QVector<void (*)()> > И уже по примеру Kurles запускать нужную последовательность с нужной ф-ции, только с индексами разобраться :) Название: Re: Автомат, или фиксированная последовательность. Как? Отправлено: Igors от Февраль 21, 2012, 09:58 С последовательностью состояний как раз все понятно, это нередко встречается (пусть в самых разнообразных формах). Но откуда взялась проблема множества switch - остается загадкой. Почему не проходит напр такая простейшая схема
Код Ну где-то "на стороне" вычисляете mState и вызываете Run - вот и "вклинились" Название: Re: Автомат, или фиксированная последовательность. Как? Отправлено: Bepec от Февраль 21, 2012, 10:15 Множество последовательностей ;)
Причём с "той стороны" приходят только ответы, без состояний ;) (там как раз жёсткий автомат и стоит, переключиться с 1 на 7 позицию он не может, может только сбросить. ) Название: Re: Автомат, или фиксированная последовательность. Как? Отправлено: Igors от Февраль 21, 2012, 10:39 Множество последовательностей ;) И что? Почему нельзя все поместить в один switch? Каждая ветка решает какое следующее состояние установить (возможно с предисторией) на основании текущего состояния + пришедших данных. В общем случае это граф (вершины-ребра, или состояния-переходы).Причём с "той стороны" приходят только ответы, без состояний ;) (там как раз жёсткий автомат и стоит, переключиться с 1 на 7 позицию он не может, может только сбросить. ) Название: Re: Автомат, или фиксированная последовательность. Как? Отправлено: Bepec от Февраль 21, 2012, 10:45 Нельзя - потому что изменение одной ветки приведёт к изменению другой, если не более (будет прям таки пирамидальная зависимость.)
Далее в таком коде будет оч. сложно разобраться, а уж при изменениях... Бррр... Даже чтобы поменять местами придётся править в 3-4 местах. |