![]() |
|
|
![]()
|
|
| chaos |
|
||||||||||
![]() Серийный программист ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2979 Регистрация: 7.7.2004 Где: Екатеринбург Репутация: 5 Всего: 44 |
Дорого времени суток!
стало интересна следующая задача: есть Event
есть такая штука
команда
делегат
токен
вот. Команда значит реализует интерфейс респондера. Сервис пускай реализует AsyncToken. вообщем получилась такая "каша" посылается конкретынй ивент, по типу ивента создаем команду, бизнес делегата для конкретной команды запускаем ее.через делегат обращаемся к сервису, вызывая конкретную функцию(асинхронно), тот нам в свою очередь "бумажку, мол распишитесь" Вопрос: как лучше убить команду после выполнения слота? Добавлено @ 12:54 Самый прсото способ удалять команду в слотах, те в самом конце выполнения оных, но не хочу про это постоянно помнить. Это сообщение отредактировал(а) chaos - 22.10.2009, 20:03 |
||||||||||
|
|||||||||||
| SABROG |
|
||||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
Судя по документации в функцию construct передается параметр типа int, а не QString. Здесь, возможно, опечатка из-за того, что ты уже сам запутался где у тебя чего: evt->userName() и event->password()
Тоже опечатка. Судя по всему это не рабочий код. Пытаясь вникнуть в тему и просидя за твоим постом 10 минут внимательно вчитываясь я пришел к выводу, что вопрос можно было сформировать так: Здесь создается копия зарегистрированного объекта пользовательского типа:
Что-то типа new ICommand; Т.к. тип не на базе QObject'a и экземпляр класса должен жить в момент выполнения цикла событий, т.к. происходит асинхронная работа, то удалять его в конце метода event() нельзя, а надо, чтобы он удалился сам, когда станет не нужным, методом deleteLater() воспользоваться не удастся. Вариант удалять в конце метода не приемлем, т.к. не хочется помнить об этом и т.д. Тогда варианты такие: объект класса QEvent удаляется сам. Параметры можно передавать как через сигналы, так и через эвенты. Т.е. вариант отказаться от своего пользовательского типа или сделать его на базе QObject. Еще можно попробовать заменить QApplication::postEvent на QApplication::sendEvent, дождаться выполнения и удалить экземпляр команды, соотнося его с каким-то конкретным эвентом. |
||||
|
|||||
| chaos |
|
||||
![]() Серийный программист ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2979 Регистрация: 7.7.2004 Где: Екатеринбург Репутация: 5 Всего: 44 |
1. оцепятка так скаже
2. Ага, тоже опечатка. evt должно быть 3. опечатки вроде нет 4. код ага, не рабочий. это так сказать мысли только 5. По классу команда. щас я его пока вижу таким
6. да, ты прав! вопрос можно было короче поставить |
||||
|
|||||
| SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
У тебя тут буква "k", вместо "c". |
|||
|
||||
| chaos |
|
|||
![]() Серийный программист ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2979 Регистрация: 7.7.2004 Где: Екатеринбург Репутация: 5 Всего: 44 |
SABROG, а да. сорри. невнимательность.
ЗЫ У кого-нить есть еще какие идейки? ЗЫЫ почему низя удалить команду в слоте?
|
|||
|
||||
| SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
Если удаление должно происходить после result(), то как вариант можно посылать специальный event, который будет перехватывать основной класс или менеджер команд и удалять полученный указатель. В итоге возврата в удаленный объект не будет. Если не эвент, то сигнал с Qt::QueuedConnection, или QMetaObject::invokeMethod тоже с Qt::QueuedConnection или QTimer c 0 задержкой. Получится подобие deleteLater(). P.S.: delete this Это сообщение отредактировал(а) SABROG - 23.10.2009, 17:53 |
|||
|
||||
| chaos |
|
|||
![]() Серийный программист ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2979 Регистрация: 7.7.2004 Где: Екатеринбург Репутация: 5 Всего: 44 |
||||
|
||||
| SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
На самом деле вопрос даже не о Qt, т.к. ты не хочешь пользоваться тем, что она предоставляет, а вопрос скорее для раздела "Общие вопросы", т.к. сам цикл событий можно заменить и посредством winapi. |
|||
|
||||
| chaos |
|
||||
![]() Серийный программист ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2979 Регистрация: 7.7.2004 Где: Екатеринбург Репутация: 5 Всего: 44 |
не, как раз таки хочу пользоваться фишками Qt(например QMetaType, signals&slots, ....) запостил топик именно сюда, тк думал что можно както-средствами QT можно решить проблему. Только пока не придумал как, тк переопределив метод deleteLater не совсем понятно потом как его удалить |
||||
|
|||||
| SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
А если сделать ICommand на базе QEvent?
|
|||
|
||||
| chaos |
|
|||
![]() Серийный программист ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2979 Регистрация: 7.7.2004 Где: Екатеринбург Репутация: 5 Всего: 44 |
а как тогда с асинхронностью дела будут обстоять? те, идею я понял, QEvent'а по началу нового цикла обработки сообщений "убьют"(поправте если ошибаюсь). |
|||
|
||||
| SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
А чего им обстоять? Асинхронности в цикле событий как таковой не существует, если ты поставишь sleep() в каком нибудь обработчике эвента или слоте, то все остальные команды будут лежать в очереди, пока не произойдет выход из обработчика. То есть у тебя есть всего лишь очередь команд, которые выполняются последовательно. Вот многопоточность это уже асинхронность. Если брать тот же как бы асинхронный QNetworkAccessManager, то на скорость скачивания файла и скорость соединения будет влиять время выполнения других методов программы. Если один из них подвесит на некоторое время программу, то эвенты от ОС могут прийти целым шквалом по возвращению в главный цикл событий. |
|||
|
||||
| chaos |
|
|||
![]() Серийный программист ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2979 Регистрация: 7.7.2004 Где: Екатеринбург Репутация: 5 Всего: 44 |
это я вроде все понимаю.
вот пример: 1. Команда у нас подкласс QEvent 2. когда приходит ивент мы у него дерним метод execute 3. внутри метода например вызовится метод сокеты connect + подпишемся на на сигналы. на этом метод execute закончится. 4. удалится ли "ивент" ? |
|||
|
||||
| SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
|
|||
|
||||
| chaos |
|
|||
![]() Серийный программист ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2979 Регистрация: 7.7.2004 Где: Екатеринбург Репутация: 5 Всего: 44 |
SABROG, вообщем не получается красивого решения найти.
у меня последний вопрос: на сколько опасно в рамках QT удалять самого себя в слоте, при том что я гарантирую что больше объект никому не понадобится? |
|||
|
||||
![]()
|
| Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |