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

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

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: QThread  (Прочитано 9648 раз)
Bepec
Гость
« Ответ #15 : Декабрь 12, 2014, 17:16 »

EventLoop будет Widget. Так что спокойно встанет, дождётся выключения потока и успешно удалится.


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

Сообщений: 4350



Просмотр профиля
« Ответ #16 : Декабрь 12, 2014, 17:17 »

А для Вас я запостил тему про темплейты, лучше там ответьте
Я саму разберусь, в какой теме мне отвечать, а в какой нет.

Нечего его защищать, как всегда ляпнул не подумавши - пусть отвечает.
И сам решу, кого мне защищать, а кого нет. К тому же я никого не защищаю, скорее по этому вопросу думаю также.
Это вы ваши сложности с deleteLater и вообще с очередями сообщений, пытаетесь представить вселенской опасностью. А она яйца выеденного не стоит, если понимать, что делаешь.А по другому, лучше ничего не делать.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #17 : Декабрь 12, 2014, 17:20 »

EventLoop будет Widget. Так что спокойно встанет, дождётся выключения потока и успешно удалится.
А если объект класса Thread делает moveToThread?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #18 : Декабрь 12, 2014, 18:12 »

EventLoop будет Widget.
Неверно (по крайней мере в общем случае)
Так что спокойно встанет, дождётся выключения потока и успешно удалится.
Тоже неверно, никто никого дожидаться не будет
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #19 : Декабрь 12, 2014, 18:16 »

Неверно (по крайней мере в общем случае)
Как раз в общем случае верно, объект QThread будет принадлежать создающей его нитке, а не порождаемой им.

Тоже неверно, никто никого дожидаться не будет
Тут не знаю про что вы говорите. Улыбающийся
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #20 : Декабрь 12, 2014, 19:30 »

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

Тут не знаю про что вы говорите. Улыбающийся
Просто когда дело дойдет до события DeferredDelete (порожденного deleteLater), то объект удалится невзирая на  "незавершенный поток".

Это вы ваши сложности с deleteLater и вообще с очередями сообщений, пытаетесь представить вселенской опасностью. А она яйца выеденного не стоит, если понимать, что делаешь.А по другому, лучше ничего не делать.
Никогда не боялся очередей. Да, получал неск раз по ушам, но гораздо меньше чем в др местах. Вернемся к первоисточнику
Код
C++ (Qt)
if(thread != NULL){
    thread->startThread = false
    thread->quit();
    thread->wait();
    thread->deleteLater();
Вы совершенно правильно указали что без контекста невозможно предсказать поведение deleteLater. Весьма вероятно где-то выше понадобится
Код
C++ (Qt)
thread->moveToThread(thread)
Иначе какой смысл крутить там EventLoop? Но тогда событие DeferredDelete будет помещено в очередь thread - но она уже остановлена (thread->quit()). Когда же удалится  thread? Наверное никогда (без доп действий). Почему "наверное" - ну хз, может у Qt есть доп процессинг для этого случая (вряд ли, но не проверял).

Спрашивается: а за каким <template> было так делать, искать ненужных приключений? Чем было плохо простецкое delete? Зачем надо было продлевать жизнь thread? Что хотели еще от нее получить? Это называется "понимать что делаешь"? Совсем наоборот. Тоже мне, сокол защищающий выеденные яйца  Улыбающийся
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #21 : Декабрь 12, 2014, 19:37 »

Это называется "понимать что делаешь"? Совсем наоборот.
Смешались в кучу кони люди... Улыбающийся Ну да ладно.

Записан
Bepec
Гость
« Ответ #22 : Декабрь 12, 2014, 20:15 »

Igors в общем случае поведение будет согласно моему сообщению. А вот перенос QThread moveToThread как раз отдельный случай.

Зачем ждать? потому что поток может быть занят вычислениями. Ему пофиг что там кто-то где-то приказал завершаться Улыбающийся И он будет заканчивать заданную ему работу. Именно на этот случай и сделан Wait, дающий ему время на корректное и заложенное по умолчанию завершение.

И да, deleteLater тут возможно избыточен, но тем не менее он сработает и будет всё хорошо Улыбающийся

И скорее всего ситуация с вызовом deleteLater из собственного потока обрабатывается Qt. Ибо ни разу не имел с deleteLater утечек памяти.

PS попадал однажды в похожую ситуацию с потоками, но давно. К сожалению найти исходников не смог.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #23 : Декабрь 12, 2014, 20:57 »

Зачем ждать? потому что поток может быть занят вычислениями. Ему пофиг что там кто-то где-то приказал завершаться Улыбающийся И он будет заканчивать заданную ему работу.
Никто никого не ждет - сказали удалить QThread - и этот объект будет удален, занимаемая им память станет доступной для других. Если поток (порожденный этой QThread) еще работает (используя удаленные данные) - ну вылетит, c'est la vie

Именно на этот случай и сделан Wait, дающий ему время на корректное и заложенное по умолчанию завершение.
Ничего он не дает и никаких умолчаний нет. Это просто останов текущей нитки до тех пор пока указанная не завершится - и все (см pthread_join). Если указанная не собирается завершаться  - текущая ждет forever 
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


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