Russian Qt Forum
Март 29, 2024, 10:45
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Многопоточное программирование, процессы
>
Удаление аггрегируемого объекта в другом потоке
Страниц: [
1
]
2
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Удаление аггрегируемого объекта в другом потоке (Прочитано 9079 раз)
Fynjisx
Гость
Удаление аггрегируемого объекта в другом потоке
«
:
Ноябрь 21, 2018, 13:10 »
Привет всем! Вопрос такой:
Есть класс, в котором один из агрегируемых объектов после создания класса переносится в другой поток!
Если я разрушаю объект класса верхнего уровня, будет ли удаляться агрегируемый объект, который уже в другом потоке или ему надо явно засылать deletelater в деструкторе класса верхнего уровня???
Записан
RedDog
Частый гость
Offline
Сообщений: 221
Re: Удаление аггрегируемого объекта в другом потоке
«
Ответ #1 :
Ноябрь 21, 2018, 13:35 »
Если ему парент назначен, то в отличный от родительского потока он не переместится.
А если не назначен, то кто его удалит, кроме программиста?
Записан
Fynjisx
Гость
Re: Удаление аггрегируемого объекта в друго
«
Ответ #2 :
Ноябрь 21, 2018, 15:49 »
Цитата: RedDog от Ноябрь 21, 2018, 13:35
Если ему парент назначен, то в отличный от родительского потока он не переместится.
А если не назначен, то кто его удалит, кроме программиста?
Парент не назначен. Я думал, все аггрегируемые объекты уничтожаются автоматически при удалении класса контейнера.
Так, как грамотно его удалить? В деструкторе класса контейнера deleteLater() сделать?
Записан
Fregloin
Супер
Offline
Сообщений: 1025
Re: Удаление аггрегируемого объекта в другом потоке
«
Ответ #3 :
Ноябрь 21, 2018, 16:26 »
Ответ - удалять вручную в другом потоке
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Удаление аггрегируемого объекта в друго&#
«
Ответ #4 :
Ноябрь 21, 2018, 16:30 »
Цитата: Fynjisx от Ноябрь 21, 2018, 15:49
Я думал, все аггрегируемые объекты уничтожаются автоматически при удалении класса контейнера.
Правильно думали, так и есть. Опасность что удалится объект который сейчас используется другой ниткой - проблема типовая, с "переносом" (moveToThread) она не связана. Какое-то общего/универсального решения нет. Самое простое - не удалять объект пока не завершится нитка использующая хотя бы один из его членов. Ну или связываться с QSharedPointer.
Записан
RedDog
Частый гость
Offline
Сообщений: 221
Re: Удаление аггрегируемого объекта в другом потоке
«
Ответ #5 :
Ноябрь 21, 2018, 17:32 »
Можно сконнектить сигнал destroyed() класса контейнера с методом deleteLater() вложенного класса.
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Удаление аггрегируемого объекта в другом потоке
«
Ответ #6 :
Ноябрь 21, 2018, 17:49 »
Цитата: RedDog от Ноябрь 21, 2018, 17:32
Можно сконнектить сигнал destroyed() класса контейнера с методом deleteLater() вложенного класса.
Это не поможет если удаляется объект "верхнего уровня", все его члены будут разрушены.
Записан
RedDog
Частый гость
Offline
Сообщений: 221
Re: Удаление аггрегируемого объекта в другом потоке
«
Ответ #7 :
Ноябрь 21, 2018, 19:16 »
Цитата: Igors от Ноябрь 21, 2018, 17:49
Цитата: RedDog от Ноябрь 21, 2018, 17:32
Можно сконнектить сигнал destroyed() класса контейнера с методом deleteLater() вложенного класса.
Это не поможет если удаляется объект "верхнего уровня", все его члены будут разрушены.
С чего это, если парента никто не назначал?
Код:
Container::Container(QObject *parent)
: QObject(parent)
, m_workersThread(new QThread)
{
m_workersThread->start();
QObject::connect(m_workersThread, &QThread::started,
this, &Container::run);
QObject::connect(this, &Container::ready,
this, &QObject::deleteLater);
}
void Container::run()
{
for (int i = 0; i < 3; ++i)
{
Worker* worker = new Worker;
QObject::connect(this, &QObject::destroyed,
worker, &QObject::deleteLater);
worker->moveToThread(m_workersThread);
m_workers.push_back(worker);
}
emit ready();
}
Worker::Worker(QObject *parent)
: QObject(parent)
{
}
Worker::~Worker()
{
qDebug() << "destroy";
}
выводит 3 раза "destroy"
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Удаление аггрегируемого объекта в другом потоке
«
Ответ #8 :
Ноябрь 22, 2018, 07:22 »
Цитата: RedDog от Ноябрь 21, 2018, 19:16
С чего это, если парента никто не назначал?
Причем тут парент? Насколько я понял, у ТС такая ситуевина
Код
C++ (Qt)
class
MyClass
{
...
SomeClass
m_data
;
// этот член переносится в др поток
}
;
Записан
RedDog
Частый гость
Offline
Сообщений: 221
Re: Удаление аггрегируемого объекта в другом потоке
«
Ответ #9 :
Ноябрь 22, 2018, 09:37 »
Цитата: Igors от Ноябрь 22, 2018, 07:22
Цитата: RedDog от Ноябрь 21, 2018, 19:16
С чего это, если парента никто не назначал?
Причем тут парент? Насколько я понял, у ТС такая ситуевина
Код
C++ (Qt)
class
MyClass
{
...
SomeClass
m_data
;
// этот член переносится в др поток
}
;
Если человек задался вопросом про deleteLater() то логично было предположить, что он работает через указатели. Что я собственно и сделал.
Записан
ViTech
Гипер активный житель
Offline
Сообщений: 858
Re: Удаление аггрегируемого объекта в другом потоке
«
Ответ #10 :
Ноябрь 22, 2018, 11:32 »
Цитата: Igors от Ноябрь 22, 2018, 07:22
Причем тут парент? Насколько я понял, у ТС такая ситуевина
...
Цитата: RedDog от Ноябрь 22, 2018, 09:37
Если человек задался вопросом про deleteLater() то логично было предположить, что он работает через указатели. Что я собственно и сделал.
Я делаю ставку, что там должен быть QPointer, кто больше?
Может лучше пусть ТС сам расскажет, что именно у него там находится, какая агрегация и зачем потоки.
Записан
Пока сам не сделаешь...
Авварон
Джедай : наставник для всех
Offline
Сообщений: 3257
Re: Удаление аггрегируемого объекта в другом потоке
«
Ответ #11 :
Ноябрь 22, 2018, 16:54 »
Цитата: ViTech от Ноябрь 22, 2018, 11:32
Может лучше пусть ТС сам расскажет, что именно у него там находится, какая агрегация и зачем потоки.
Тссс, телепаты вышли из отпуска.
Записан
sergek
Гипер активный житель
Offline
Сообщений: 861
Мы должны приносить пользу людям.
Re: Удаление аггрегируемого объекта в другом потоке
«
Ответ #12 :
Ноябрь 22, 2018, 17:00 »
Коллеги, может просто рассмотрим варианты указателя и объекта? Не знаю, зачем это нужно, но ну его, этого ТС, просто интересно.
Записан
Qt 5.13.0 Qt Creator 5.0.1
Win10, Ubuntu 20.04
RedDog
Частый гость
Offline
Сообщений: 221
Re: Удаление аггрегируемого объекта в другом потоке
«
Ответ #13 :
Ноябрь 22, 2018, 17:07 »
Цитата: sergek от Ноябрь 22, 2018, 17:00
Коллеги, может просто рассмотрим варианты указателя и объекта? Не знаю, зачем это нужно, но ну его, этого ТС, просто интересно.
Так уже все рассмотрели, ну кроме умных указателей.
ТСу есть из чего выбирать.
Записан
sergek
Гипер активный житель
Offline
Сообщений: 861
Мы должны приносить пользу людям.
Re: Удаление аггрегируемого объекта в другом потоке
«
Ответ #14 :
Ноябрь 22, 2018, 17:52 »
Цитата: RedDog от Ноябрь 22, 2018, 17:07
Так уже все рассмотрели, ну кроме умных указателей.
Да? Может, я зря сомневаюсь, но если указатели, и послан сигнал на deleteLate объекта в другом потоке, то нужно ли контейнеру дожидаться, пока объект уничтожится?
Записан
Qt 5.13.0 Qt Creator 5.0.1
Win10, Ubuntu 20.04
Страниц: [
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 сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...