Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Qt]EventSequence 
:(
    Опции темы
chaos
Дата 16.3.2010, 17:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

Репутация: 5
Всего: 44



Доброго времени суток!

оффтоп как и обещал начал заниматься проектом QCairngorm. начал только вчера smile

Стоит следующая задача: попробовать реализовать EventSequence.
Начну с описания что такое Event в моем проекте.
Event(EventBase) не что иное как событие призывающее что-ли бо сделать. Наприер в вашем любимом ICQ клиенте кнопочка "войти в сеть"
Код

void someWidget::on_connectButton_clicked()
{
    (new ConnectEvent("127.0.0.1", 6666))->dispatch();
}


дальше сообщение диспетчеризируется FrontController'у который создает конкретную Command для реализации действия.
результатом команды будет вызов одного из двух ее методов: result или fail. дальше идет обновление модели в зависимости от ситуайии(result или fail),
а дальше обновление конкретного вида(view) на основании изменений в модели.

Дальше.
Например для работы вашего ICQ клиента необходимо: установить подключение(ConnectEvent), проийти авторизацию(AuthEvent)
и загрузить список контактов(LoadContactListEvent)

делается это следующим образом

Код

//клик по кнопке "Подключиться"
SomeView::on_connectButton_clicked()
{
    (new ConnectEvent("127.0.0.1", 6666))->dispatch();
}

//слот для уведомления модели о том что подключение произошло
SomeView::on_model_connected()
{
    (new AuthEvent("user", "passwd"))->dispatch();
}

//модель уведомила нас о том что мы успешно авторизовались
SomeView::on_model_authorized()
{
    (new LoadContactListEvent)->dispatch();
}

//пролучили контакт лист
SomeView::on_model_contactListIncoming(.....)
{
}


думаю тут все понятно.
идея сделать как-нибудь так(в псевдокоде):
Код

EventSequence eventSequence;
eventSequence.addEvent(new ConnectEvent("127.0.0.1", 6666));
eventSequence.addEvent(new AuthoEvent("user", "passwd"), model, SIGNAL(connected()));
eventSequence.addEvent(new LoadContactListEvent, model, SIGNAL(authorized()));
eventSequence.dispatch();


идея тоже думаю понятна. Возникает проблема: если например соединение не произошло,
то модель не послала сигнал connected соответственно последовательность ивентов прирвется

Вопросы которые пытаюсь решить
1. Что должна из себя представлять EventSequence(объет в стеке или куче)? думаю что в куче.
2. не сработал "триггер" для диспетчеризации следующего в последовательности ивента - как об этом узнать(как вариант сделать 2 тригера: на ошибку и если все хорошо)?
3. если последовательность прервалась(п.2), то как прибить EventSequence если он в куче


Заранее благодарен за любую помощь




Это сообщение отредактировал(а) chaos - 16.3.2010, 18:27
PM WWW   Вверх
SABROG
Дата 17.3.2010, 00:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



Цитата(chaos @  16.3.2010,  17:07 Найти цитируемый пост)
Что должна из себя представлять EventSequence(объет в стеке или куче)? думаю что в куче.

Может сделать фабрику объектов? Пользователь создает свою команду или цепь команд на основе некоторого базового класса в деструкторе которого извлекается результат операции и передается на фабрику, чтобы она могла принять решение об остановки очереди в случае fail или о добавлении следующей команды в очередь при положительность результате. Цепь можно организовать по аналогии с parent'ом QObject'a. Затем root'овый объект (самый первый элемент) регистрируется на фабрике объектов. Сама фабрика проходит по детям объекта и выстраивает зависимую очередь команд.

Цитата(chaos @  16.3.2010,  17:07 Найти цитируемый пост)
если последовательность прервалась(п.2), то как прибить EventSequence если он в куче

Фабрика может создавать экземпляры команд в куче, все эвенты Qt грохает сама после того как они были переданы объекту для обработки. В методе такого объекта можно выставлять результат команды, а сама команда будет в деструкторе сообщать фабрике об успешности операции как я писал выше.

Псевдокод мог бы выглядеть так:
Код

ConnectCommand connect("127.0.0.1", 6666);
AuthoCommand autho(&connect, "user", "passwd", model, SIGNAL(connected()));
LoadContactListCommand loadCLC(&autho, model, SIGNAL(authorized())); // возможно указатель на модель стоит сделать статическим

CommandFactory::registerCommand("Connect", &connect); // регистрируем команду
...
CommandFactory::invoke("Connect"); // запускаем цепь комманд, параметры всегда одни и те же
...
CommandUnit* connectUnit = CommandFactory::command("Connect"); // делаем выборку команды, чтобы изменить параметры
ConnectCommand* connect = static_cast<ConnectCommand*>(connectUnit);
connect->setIp("192.168.1.1");
CommandFactory::invoke("Connect");


Как-то так, правда придется каждый раз делать копию объекта, чтобы поместить в очередь, ведь он потом удалиться, а на фабрике всегда иметь эталонный экземпляр, где можно изменить параметры.

Еще вместо конкретных имен комманд можно регистрировать ID, завести enum'ы.

Всё это мне напоминает State Machine Framework.

Это сообщение отредактировал(а) SABROG - 17.3.2010, 00:21


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0417 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.