Russian Qt Forum
Ноябрь 26, 2024, 02:50
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Вопросы новичков
>
deleteLater(),close()
Страниц:
1
[
2
]
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: deleteLater(),close() (Прочитано 10087 раз)
RedDog
Гость
Re: deleteLater(),close()
«
Ответ #15 :
Май 08, 2013, 13:27 »
По наблюдениям, в Qt гораздо опаснее использовать обычный delete, нежели deleteLater().
Записан
Alex Custov
Джедай : наставник для всех
Offline
Сообщений: 2063
Re: deleteLater(),close()
«
Ответ #16 :
Май 08, 2013, 13:44 »
Цитата: RedDog от Май 08, 2013, 13:27
По наблюдениям, в Qt гораздо опаснее использовать обычный delete, нежели deleteLater().
Это зависит от каждой конкретной ситуации. Где-то по логике вещей нужно deleteLater(), где-то это будет избыточно.
Записан
Bepec
Гость
Re: deleteLater(),close()
«
Ответ #17 :
Май 08, 2013, 14:26 »
Но кто-нибудь напишет, ЧЕМ опасен deleteLater?
Конкретику пожалуйста приведите, сторонники "опасности".
Записан
Странник
Гость
Re: deleteLater(),close()
«
Ответ #18 :
Май 08, 2013, 15:15 »
Цитата: Bepec от Май 08, 2013, 14:26
Но кто-нибудь напишет, ЧЕМ опасен deleteLater?
Конкретику пожалуйста приведите, сторонники "опасности".
delete удаляет объект здесь и сейчас, поэтому понятен и прозрачен.
deleteLater() удаляет объект там и потом, поэтому предсказать его поведение бывает сложно. а это чревато и обращением по невалидному указателю (когда eventloop получил управление и удалил объект раньше, чем вы ожидаете), и чехардой с сигналами-слотами (когда объект перед своим удалением успевает получить-отправить непредвиденные сигналы). не переусложняйте и да воздастся вам.
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: deleteLater(),close()
«
Ответ #19 :
Май 08, 2013, 15:34 »
Цитата: Bepec от Май 08, 2013, 14:26
Но кто-нибудь напишет, ЧЕМ опасен deleteLater?
Конкретику пожалуйста приведите, сторонники "опасности".
Те опасности известны задолго до появления Qt, поэтому я, право, удивлен настойчивыми вопросами
Что делает deleteLater? Засылает в очередь событие удаления. А сколько еще событий в той очереди? Да хз, может и сотни других, и пока дело дойдет до удаления, объект живет полной жизнью, напр принимает/испускает те же сигналы и.т.п. Бывают случаи когда это желательно, но чаще нет, а безболезненно "обесточить" объект обычно трудно. В конце-концов eventLoop могут и грохнуть, и объект повиснет.
Наступив разок на эти грабли и потеряв неск дней на такую заморочку - энтузиазм к deleteLater испарится очень быстро. Ну а до этого можно поизображать "иронию"
Вот пример (псевдокод) тяжелого бага из моей практики
Код
C++ (Qt)
PostEvent
(
eventCreateJob
,
jobID
)
;
PostEvent
(
eventStartJob
,
jobID
,
param
)
;
Хотя это и не deleteLater, но "из той же оперы"
Записан
Bepec
Гость
Re: deleteLater(),close()
«
Ответ #20 :
Май 08, 2013, 15:38 »
Проще выражаясь, вывод:
Если перед вызовом deleteLater вызвать слот disconnect, то deleteLater по опасности равен оператору delete.
Так?
PS остальные доводы я считаю несущественными, ибо они относятся к delete тоже.
update:
Igors, давайте отсеивать "нестабильную работу" и "опасность".
Дисконнект отсеет опасность сигналов-слотов.
Крах цикла событий в редких случаях нормален.
PPS я так понимаю, приведённый вами код выполнится через неопределённое время, при стабильной работе цикла событий?
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: deleteLater(),close()
«
Ответ #21 :
Май 08, 2013, 15:43 »
Цитата: Bepec от Май 08, 2013, 15:38
PPS я так понимаю, приведённый вами код выполнится через неопределённое время, при стабильной работе цикла событий?
Ну если я засылаю события в очередь - я тем самым соглашаюсь с "неопределённым временем", это не проблема. Не спешите с ответами - Вас ведь никто не гонит
Записан
Bepec
Гость
Re: deleteLater(),close()
«
Ответ #22 :
Май 08, 2013, 15:56 »
Ну тогда разве что события прошли друг за другом, но объект ещё не успел создаться.
Инциденты:
1) слишком долгая доставка; (нормально)
2) слишком быстрая доставка; (объект не успевает создаться, задача не выполняется)
3) нарушение цикла событий; (! исключительная ситуация)
4) что-то внешнее, чего придумать не могу.
хм. Вроде всё.
Записан
Странник
Гость
Re: deleteLater(),close()
«
Ответ #23 :
Май 08, 2013, 16:39 »
Цитата: Bepec от Май 08, 2013, 15:38
Проще выражаясь, вывод:
Если перед вызовом deleteLater вызвать слот disconnect, то deleteLater по опасности равен оператору delete.
Так?
PS остальные доводы я считаю несущественными, ибо они относятся к delete тоже.
update:
Igors, давайте отсеивать "нестабильную работу" и "опасность".
Дисконнект отсеет опасность сигналов-слотов.
Крах цикла событий в редких случаях нормален.
PPS я так понимаю, приведённый вами код выполнится через неопределённое время, при стабильной работе цикла событий?
еще раз повторю, в случае использования delete вам точно известен момент, когда указатели становятся невалидными и разрываются все сигнал-слотовые соединения.
сам же факт использования deleteLater() предполагает, что вы хотите пользоваться объектом еще некоторое время после вызова. то есть, вам нужны валидные указатели и, возможно, сигнал-слоты. время же удаления объекта может варьироваться в зависимости от различных факторов и в целом менее предсказуемо.
Записан
Bepec
Гость
Re: deleteLater(),close()
«
Ответ #24 :
Май 08, 2013, 16:47 »
Эм? deleteLater предполагает удаление после выполнения всех остальных евентов. Всё. Он ничего не означает более. И зануление используемого указателя, как и при использовании delete вас спасёт.
Проще выражаясь - выполняет всё то, что должен был ДО момента вызова deleteLater и убиение объекта. И не подразумевается, что вы будете использовать объект.
Странник, то ли я вас не понимаю, то ли вы не понимаете работу deleteLater. Там посылается евент самому себе на уничтожение. Все евенты ДО него будут выполнены. После него никакого евента не будет.
И вы же не используете удалённый delete указатель? Так почему же вы используете поставленный на удаление ?
Записан
thechicho
Гость
Re: deleteLater(),close()
«
Ответ #25 :
Май 09, 2013, 21:39 »
deleteLater() для асинхронного кодинга. если лень в слоте потом удалять, пишешь deleteLater()
Записан
Страниц:
1
[
2
]
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...