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

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

Страниц: 1 [2] 3 4 5   Вниз
  Печать  
Автор Тема: MoveToThread (все-таки хочется понять ..)  (Прочитано 47901 раз)
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.231 секунд. Запросов: 23.