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

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

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: deleteLater(),close()  (Прочитано 10085 раз)
RedDog
Гость
« Ответ #15 : Май 08, 2013, 13:27 »

По наблюдениям, в Qt гораздо опаснее использовать обычный delete, нежели deleteLater().
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #16 : Май 08, 2013, 13:44 »

По наблюдениям, в Qt гораздо опаснее использовать обычный delete, нежели deleteLater().

Это зависит от каждой конкретной ситуации. Где-то по логике вещей нужно deleteLater(), где-то это будет избыточно.
Записан
Bepec
Гость
« Ответ #17 : Май 08, 2013, 14:26 »

Но кто-нибудь напишет, ЧЕМ опасен deleteLater?

Конкретику пожалуйста приведите, сторонники "опасности".
Записан
Странник
Гость
« Ответ #18 : Май 08, 2013, 15:15 »

Но кто-нибудь напишет, ЧЕМ опасен deleteLater?

Конкретику пожалуйста приведите, сторонники "опасности".
delete удаляет объект здесь и сейчас, поэтому понятен и прозрачен.
deleteLater() удаляет объект там и потом, поэтому предсказать его поведение бывает сложно. а это чревато и обращением по невалидному указателю (когда eventloop получил управление и удалил объект раньше, чем вы ожидаете), и чехардой с сигналами-слотами (когда объект перед своим удалением успевает получить-отправить непредвиденные сигналы). не переусложняйте и да воздастся вам.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #19 : Май 08, 2013, 15:34 »

Но кто-нибудь напишет, ЧЕМ опасен deleteLater?

Конкретику пожалуйста приведите, сторонники "опасности".
Те опасности известны задолго до появления Qt, поэтому я, право, удивлен настойчивыми вопросами  Улыбающийся Что делает deleteLater? Засылает в очередь событие удаления. А сколько еще событий в той очереди? Да хз, может и сотни других, и пока дело дойдет до удаления, объект живет полной жизнью, напр принимает/испускает те же сигналы и.т.п. Бывают случаи когда это желательно, но чаще нет, а безболезненно "обесточить" объект обычно трудно. В конце-концов eventLoop могут и грохнуть, и объект повиснет.

Наступив разок на эти грабли и потеряв неск дней на такую заморочку - энтузиазм к deleteLater испарится очень быстро. Ну а до этого можно поизображать "иронию"  Улыбающийся

Вот пример (псевдокод) тяжелого бага из моей практики
Код
C++ (Qt)
PostEvent(eventCreateJob, jobID);
PostEvent(eventStartJob, jobID, param);
 
Хотя это и не deleteLater, но "из той же оперы"

Записан
Bepec
Гость
« Ответ #20 : Май 08, 2013, 15:38 »

Проще выражаясь, вывод:

Если перед вызовом deleteLater вызвать слот disconnect, то deleteLater по опасности равен оператору delete.

Так?

PS остальные доводы я считаю несущественными, ибо они относятся к delete тоже.

update:
Igors, давайте отсеивать "нестабильную работу" и "опасность".

Дисконнект отсеет опасность сигналов-слотов.

Крах цикла событий в редких случаях нормален.

PPS я так понимаю, приведённый вами код выполнится через неопределённое время, при стабильной работе цикла событий?

Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #21 : Май 08, 2013, 15:43 »

PPS я так понимаю, приведённый вами код выполнится через неопределённое время, при стабильной работе цикла событий?
Ну если я засылаю события в очередь - я тем самым соглашаюсь с "неопределённым временем", это не проблема. Не спешите с ответами - Вас ведь никто не гонит  Улыбающийся
Записан
Bepec
Гость
« Ответ #22 : Май 08, 2013, 15:56 »

Ну тогда разве что события прошли друг за другом, но объект ещё не успел создаться.

Инциденты:

1) слишком долгая доставка; (нормально)
2) слишком быстрая доставка; (объект не успевает создаться, задача не выполняется)
3) нарушение цикла событий; (! исключительная ситуация)
4) что-то внешнее, чего придумать не могу.

хм. Вроде всё.
Записан
Странник
Гость
« Ответ #23 : Май 08, 2013, 16:39 »

Проще выражаясь, вывод:

Если перед вызовом deleteLater вызвать слот disconnect, то deleteLater по опасности равен оператору delete.

Так?

PS остальные доводы я считаю несущественными, ибо они относятся к delete тоже.

update:
Igors, давайте отсеивать "нестабильную работу" и "опасность".

Дисконнект отсеет опасность сигналов-слотов.

Крах цикла событий в редких случаях нормален.

PPS я так понимаю, приведённый вами код выполнится через неопределённое время, при стабильной работе цикла событий?


еще раз повторю, в случае использования delete вам точно известен момент, когда указатели становятся невалидными и разрываются все сигнал-слотовые соединения.
сам же факт использования deleteLater() предполагает, что вы хотите пользоваться объектом еще некоторое время после вызова. то есть, вам нужны валидные указатели и, возможно, сигнал-слоты. время же удаления объекта может варьироваться в зависимости от различных факторов и в целом менее предсказуемо.
Записан
Bepec
Гость
« Ответ #24 : Май 08, 2013, 16:47 »

Эм? deleteLater предполагает удаление после выполнения всех остальных евентов. Всё. Он ничего не означает более. И зануление используемого указателя, как и при использовании delete вас спасёт.

Проще выражаясь - выполняет всё то, что должен был ДО момента вызова deleteLater и убиение объекта. И не подразумевается, что вы будете использовать объект.

Странник, то ли я вас не понимаю, то ли вы не понимаете работу deleteLater. Там посылается евент самому себе на уничтожение. Все евенты ДО него будут выполнены. После него никакого евента не будет.

И вы же не используете удалённый delete указатель? Так почему же вы используете поставленный на удаление ?
Записан
thechicho
Гость
« Ответ #25 : Май 09, 2013, 21:39 »

deleteLater() для асинхронного кодинга. если лень в слоте потом удалять, пишешь deleteLater()
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


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