Russian Qt Forum
Июля 01, 2025, 17:18 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Страниц: 1 [2] 3 4 5   Вниз
  Печать  
Автор Тема: MoveToThread (все-таки хочется понять ..)  (Прочитано 49362 раз)
BRE
Гость
« Ответ #15 : Марта 20, 2012, 14:16 »

Igors, BRE а с удалением то что и как? Подмигивающий

сделать delete this; в конце run() == выстрелить себе в ногу, потом отрезать в месте прострела ножом и поджечь. Улыбающийся
Записан
Bepec
Гость
« Ответ #16 : Марта 20, 2012, 14:19 »

Таки дык животрепещущий вопрос - если поток дошёл до конца run(), он самоликвидируется, али что?
Записан
BRE
Гость
« Ответ #17 : Марта 20, 2012, 14:21 »

Таки дык животрепещущий вопрос - если поток дошёл до конца run(), он самоликвидируется, али что?
Поток да, объект QThread нет.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #18 : Марта 20, 2012, 14:26 »

С точки зрения архитектуры, IMHO, лучше относится к QThread как в "управляльщику" потока, а не как к потоку.
Как уже отметил Авварон есть масса случаев когда данных (с которыми работает нитка) - с гулькин нос, и городить там воркера нет желания, просто обработка в самой нитке - и все дела

Igors, BRE а с удалением то что и как? Подмигивающий
Не знаю, мне никогда не приходило в голову "дать нитке еще и родителя". Если он нулевой то и проблем нет
Записан
Bepec
Гость
« Ответ #19 : Марта 20, 2012, 14:29 »

Интересный вопрос. У меня вон валяется программа, создающая до 18к QThread'ов последовательно. Причём создаются без родителя, в  конструкторе moveToThread и не удаляются. Однако утечки там вроде нет (память не жрёться, стандартное потребление).

Или всё же утечка там присутствует?
Записан
BRE
Гость
« Ответ #20 : Марта 20, 2012, 14:29 »

Как уже отметил Авварон есть масса случаев когда данных (с которыми работает нитка) - с гулькин нос, и городить там воркера нет желания, просто обработка в самой нитке - и все дела
В этих случаях я никого не стесняясь делаю moveToThread( this ). Улыбающийся
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #21 : Марта 20, 2012, 14:37 »

Не знаю, мне никогда не приходило в голову "дать нитке еще и родителя". Если он нулевой то и проблем нет
Ну если вы ей родителя дадите из основного потока то у вас просто напросто moveToThread не сработает.

Может приведёте минимальный компилируемый пример где нет проблем?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #22 : Марта 20, 2012, 14:38 »

Интересный вопрос. У меня вон валяется программа, создающая до 18к QThread'ов последовательно. Причём создаются без родителя, в  конструкторе moveToThread и не удаляются. Однако утечки там вроде нет (память не жрёться, стандартное потребление).

Или всё же утечка там присутствует?
Ну если Вы напр создаете через new и забыли delete - то присутствует Улыбающийся А так откуда ей взяться?
Записан
BRE
Гость
« Ответ #23 : Марта 20, 2012, 14:39 »

Можно удалять объект потока при завершении работы потока соединив сигнал finished со слотом deleteLater.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #24 : Марта 20, 2012, 14:45 »

Может приведёте минимальный компилируемый пример где нет проблем?
Недавно с лабой помогал http://www.prog.org.ru/index.php?topic=21135.msg145276#msg145276 (UI взял у V1KT0P, а нитки мои)
Записан
mutineer
Гость
« Ответ #25 : Марта 20, 2012, 14:46 »

Можно удалять объект потока при завершении работы потока соединив сигнал finished со слотом deleteLater.

deleteLater() обрабатывается в eventLoop, к которому привязан QThread. Но когда испускается finished() этот eventLoop уже завершен. Отработает ли deleteLater() ?
Записан
BRE
Гость
« Ответ #26 : Марта 20, 2012, 14:47 »

deleteLater() обрабатывается в eventLoop, к которому привязан QThread. Но когда испускается finished() этот eventLoop уже завершен. Отработает ли deleteLater() ?
Это если объект QThread перемещен в себя.
Записан
mutineer
Гость
« Ответ #27 : Марта 20, 2012, 14:49 »

deleteLater() обрабатывается в eventLoop, к которому привязан QThread. Но когда испускается finished() этот eventLoop уже завершен. Отработает ли deleteLater() ?
Это если объект QThread перемещен в себя.

Ну да. Разве тут не этот случай рассматривают?
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #28 : Марта 20, 2012, 14:54 »

Можно удалять объект потока при завершении работы потока соединив сигнал finished со слотом deleteLater.
Если связать через очередь, то удаление не произойдёт, так как цикл exec уже не существует.
Если напрямую:
Код
C++ (Qt)
QThread::wait: Thread tried to wait on itself
QThread: Destroyed while thread is still running
D:\Work\test\release\test.exe завершился с кодом -1073741819
Записан
Bepec
Гость
« Ответ #29 : Марта 20, 2012, 14:55 »

А что мешает просто delete NNN; ?
Записан
Страниц: 1 [2] 3 4 5   Вверх
  Печать  
 
Перейти в:  


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