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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Автомат, или фиксированная последовательность. Как?  (Прочитано 6638 раз)
Bepec
Гость
« : Февраль 20, 2012, 15:28 »

Приветствую заглянувших.

Имеется чёткая последовательность состояний устройства при его подключении.

Задача - вклиниться в любой из этих этапов и продолжить (возможно изменять чуть чуть, возможно просто снифферить) последовательность инициализации.

Ещё проще - есть 8 состояний. И их нужно пройти от n до 8.

Кто-то из старожилов в одной теме, упоминал QStateMashine.

Собственно вопрос: Можно ли это реализовать в Qt, каким классом. (В идеале ещё и примерчик Подмигивающий )

update:
Да, я могу это реализовать просто свичами, но это неудобно и путанно.
« Последнее редактирование: Февраль 20, 2012, 15:32 от Bepec » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #1 : Февраль 20, 2012, 16:28 »

Bepec, возможно Ваша тема интересна, но как Вы ее сформулировали - скорее всего она опять свалится в перепалку между Вами и Андрюшкой.
 
Задача - вклиниться в любой из этих этапов и продолжить (возможно изменять чуть чуть, возможно просто снифферить) последовательность инициализации.
Что значит "вклиниться" и чего изменять "чуть-чуть"? Также у меня весьма смутное понятие о "снифферах" (что-то с вебом?). Зачем раздражать людей такими мутными формулировками? Поясните на живом примере, подробно. Не тратьте свое и чужое время на наводящие вопросы и ответы.
Записан
Bepec
Гость
« Ответ #2 : Февраль 20, 2012, 17:59 »

Поясняю. Далее по тексту написано - Ещё проще. Вот с этого момента читайте.

Есть 8 состояний.
Например:
1 Идентификация - отзыв
2 Вторичная идентификация - отзыв
3 Начало общения - подтверждение
4 Запрос данных - данные
5 */*
6 */*
7 */*
8 Конец общения - подтверждение.

Как это перехватывается и почкуется - моя забота.

Что нужно? Нужно чтобы можно было запустить последовательность с любого пункта.
С 1 или с 5, или с 7.
Записан
mutineer
Гость
« Ответ #3 : Февраль 20, 2012, 18:19 »

Эти состояния в QStateMachine или где?
Записан
Bepec
Гость
« Ответ #4 : Февраль 21, 2012, 06:55 »

Это состояния в устройстве.

номер п/п     Посылаемая команда(состояние устройства)    Отклик от устройства
    1                     Идентификация                                   -         отзыв

Собственно я и спрашиваю, возможно ли это реализовать, и есть какой - либо класс для реализации этой последовательности.

Возможно ли запихнуть эти 8 состояний в QStateMachine, а потом вызывать с любого этапа в вышеизложенном порядке?

Записан
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« Ответ #5 : Февраль 21, 2012, 08:26 »

Я конечно нифига не понял Улыбающийся Но как вариант может тебе обычная очередь подойдет QQueue
Записан
Bepec
Гость
« Ответ #6 : Февраль 21, 2012, 08:44 »

Очередь это конечно интересно, но... Чуть не подходит (ибо ничем не отличается от 8 связанных функций).

Проще говоря - Нужно выполнить 8 функций подряд. Причём с указанием с какой функции начинать, аля
Код:
callFunctions(4);

В дальнейшем таких последовательностей функций будет до крыши (от 10 и выше).

Всё ещё непонятно?

Пытаюсь совсем упростить.
Пример последовательностей:

Кинуть.
  • 1.Найти камень
  • 2.Поднять камень
  • 3.Заценить вес
  • 4.Найти цель
  • 5.Перерасчитать траекторию
  • 6.Крикнуть - Я кидаю, кто не спрятался, я не виноват!
  • 7.Кинуть
  • 8.Получить результат(крик "Ай" и бессознательное тело)

И необходимо, чтобы можно было вызвать последовательность с любого этапа, аля:

Код:
if (Камень уже есть в руках) 
    Кинуть(3);


Количество последовательностей в дальнейшем будет расти, аля
1. Кинуть.
2. Плюнуть
3. Уронить.
4. Поднять.

Потому хочется узнать, есть ли спец контейнер для таких вещей? (Как меня просветили железячники, конструкция эта - жёсткий автомат)
Записан
Kurles
Бывалый
*****
Offline Offline

Сообщений: 480



Просмотр профиля
« Ответ #7 : Февраль 21, 2012, 09:15 »

Можно сделать через указатели на функции и любой из контейнеров, кот. тебе удобней. Например:
Код
C++ (Qt)
#include <QtCore/QCoreApplication>
#include <QVector>
#include <QDebug>
 
QVector<void(*)()> vecOfFunc;
 
void func0()
{
   qDebug() << "func0";
}
 
void func1()
{
   qDebug() << "func1";
}
 
void func2()
{
   qDebug() << "func2";
}
 
void func3()
{
   qDebug() << "func3";
}
 
void func4()
{
   qDebug() << "func4";
}
 
void startFrom(int i)
{
   if (vecOfFunc.size() <= i) return;
   for (; i < vecOfFunc.size(); ++i)
       (*vecOfFunc.at(i))();
}
 
 
int main(int argc, char *argv[])
{
   vecOfFunc.append(func0);
   vecOfFunc.append(func1);
   vecOfFunc.append(func2);
   vecOfFunc.append(func3);
   vecOfFunc.append(func4);
   startFrom(2);
}
 
 
that is all Улыбающийся

update: через QStateMachine сделать можно, но будет еще более неудобно и путано, чем через switch'и.
« Последнее редактирование: Февраль 21, 2012, 09:25 от Kurles » Записан

Код
C++ (Qt)
while(!asleep()) sheep++;
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« Ответ #8 : Февраль 21, 2012, 09:28 »

аке, а что мешает создать очередь ф-ций ? Улыбающийся

Код:
#include <QCoreApplication>
#include <QQueue>
#include <QDebug>

QQueue<void (*)()> queue;

void checkQueue()
{
    if (queue.size() <= 0)
        return;

    queue.removeAt(0);

    if (queue.size() <= 0)
        return;

    (queue.at(0))();
}

void one()
{
    qDebug() << Q_FUNC_INFO;
    checkQueue();
}

void tow()
{
    qDebug() << Q_FUNC_INFO;
    checkQueue();
}

void tree()
{
    qDebug() << Q_FUNC_INFO;
    checkQueue();
}

int main(int argc, char *argv[])
{
    QCoreApplication a(argc,argv);

    queue.append(&one);
    queue.append(&tow);
    queue.append(&tree);

    (queue.at(0))();

    queue.append(&tow);
    queue.append(&tree);

    (queue.at(0))();

    queue.append(&tree);
    queue.append(&tow);
    queue.append(&one);

    (queue.at(0))();

    return 0;
}


Kurles, опередил  Подмигивающий
Записан
Bepec
Гость
« Ответ #9 : Февраль 21, 2012, 09:30 »

Печально. Придётся тогда свой собственный клас написать чоле. А то 5-10 разнообразных списков... Это конечн что-то Подмигивающий

Спасибо большое всем отписавшимся.

ОГРОМНЕЙШЕЕ спасибо andrew.k, что не заходил в эту тему Подмигивающий

update to ecspertiza:

10+ последовательностей, самая маленькая - 8 функций.
Каждый раз в очередь пихать - интересно, но маловнятно.

Создать 10+ очередей - интересно, но как тогда вызывать пятый элемент последовательности? Показает язык
Записан
Kurles
Бывалый
*****
Offline Offline

Сообщений: 480



Просмотр профиля
« Ответ #10 : Февраль 21, 2012, 09:36 »


10+ последовательностей, самая маленькая - 8 функций.
Каждый раз в очередь пихать - интересно, но маловнятно.

Создать 10+ очередей - интересно, но как тогда вызывать пятый элемент последовательности? Показает язык
А ты мой ответ видел? Там как раз без очередей и с любого места, и не надо каждый  раз в очередь ничего пихать.
Записан

Код
C++ (Qt)
while(!asleep()) sheep++;
Bepec
Гость
« Ответ #11 : Февраль 21, 2012, 09:43 »

Конечно видел Подмигивающий Даже прочитал!

Цитировать
Печально. Придётся тогда свой собственный клас написать чоле. А то 5-10 разнообразных списков... Это конечн что-то Подмигивающий

Собственно прихожу к мнению, что необходимо свой класс накалякать, и там как раз будет 1 большоооой вектор с указателями Улыбающийся
Записан
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« Ответ #12 : Февраль 21, 2012, 09:56 »

update to ecspertiza:

10+ последовательностей, самая маленькая - 8 функций.
Каждый раз в очередь пихать - интересно, но маловнятно.

Создать 10+ очередей - интересно, но как тогда вызывать пятый элемент последовательности? Показает язык

Тут тебе тогда больше вариант Kurles подойдет. Насколько я понял у тебя несколько последовательностей, у каждой по несколько ф-ций. Тогда можно создать вектор что то типа

QVector< QVector<void (*)()> >

И уже по примеру Kurles запускать нужную последовательность с нужной ф-ции, только с индексами разобраться Улыбающийся
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #13 : Февраль 21, 2012, 09:58 »

С последовательностью состояний как раз все понятно, это нередко встречается (пусть в самых разнообразных формах). Но откуда взялась проблема множества switch - остается загадкой. Почему не проходит напр такая простейшая схема

Код
C++ (Qt)
void MyClass::Run( void )
{
while (true) {
 switch (mState) {
   case state_Init:
     mState = DoInit() ? state_Prepare : state_Error;
     ...
     break;
 
   case state_Error:
     ...
     break;
 
   case state_Prepare:
     ...
     break;
 
 }
}
}
 
Ну где-то "на стороне" вычисляете mState и вызываете Run - вот и "вклинились"

Записан
Bepec
Гость
« Ответ #14 : Февраль 21, 2012, 10:15 »

Множество последовательностей Подмигивающий

Причём с "той стороны" приходят только ответы, без состояний Подмигивающий (там как раз жёсткий автомат и стоит, переключиться с 1 на 7 позицию он не может, может только сбросить. )
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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