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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Удаление аггрегируемого объекта в другом потоке  (Прочитано 9079 раз)
Fynjisx
Гость
« : Ноябрь 21, 2018, 13:10 »

Привет всем! Вопрос такой:
Есть класс, в котором один из агрегируемых объектов после создания класса переносится в другой поток!
Если я разрушаю объект класса верхнего уровня, будет ли удаляться агрегируемый объект, который уже в другом потоке или ему надо явно засылать deletelater в деструкторе класса верхнего уровня???
Записан
RedDog
Частый гость
***
Offline Offline

Сообщений: 221


Просмотр профиля
« Ответ #1 : Ноябрь 21, 2018, 13:35 »

Если ему парент назначен, то в отличный от родительского потока он не переместится.
А если не назначен, то кто его удалит, кроме программиста?
Записан
Fynjisx
Гость
« Ответ #2 : Ноябрь 21, 2018, 15:49 »

Если ему парент назначен, то в отличный от родительского потока он не переместится.
А если не назначен, то кто его удалит, кроме программиста?
Парент не назначен. Я думал, все аггрегируемые объекты уничтожаются автоматически при удалении класса контейнера.
Так, как грамотно его удалить? В деструкторе класса контейнера deleteLater() сделать?
Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #3 : Ноябрь 21, 2018, 16:26 »

Ответ - удалять вручную в другом потоке
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Ноябрь 21, 2018, 16:30 »

Я думал, все аггрегируемые объекты уничтожаются автоматически при удалении класса контейнера.
Правильно думали, так и есть. Опасность что удалится объект который сейчас используется другой ниткой - проблема типовая, с "переносом" (moveToThread) она не связана. Какое-то общего/универсального решения нет. Самое простое - не удалять объект пока не завершится нитка использующая хотя бы один из его членов. Ну или связываться с QSharedPointer.
Записан
RedDog
Частый гость
***
Offline Offline

Сообщений: 221


Просмотр профиля
« Ответ #5 : Ноябрь 21, 2018, 17:32 »

Можно сконнектить сигнал destroyed() класса контейнера с методом deleteLater() вложенного класса.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Ноябрь 21, 2018, 17:49 »

Можно сконнектить сигнал destroyed() класса контейнера с методом deleteLater() вложенного класса.
Это не поможет если удаляется объект "верхнего уровня", все его члены будут разрушены. 
Записан
RedDog
Частый гость
***
Offline Offline

Сообщений: 221


Просмотр профиля
« Ответ #7 : Ноябрь 21, 2018, 19:16 »

Можно сконнектить сигнал 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 Offline

Сообщений: 11445


Просмотр профиля
« Ответ #8 : Ноябрь 22, 2018, 07:22 »

С чего это, если парента никто не назначал?
Причем тут парент? Насколько я понял, у ТС такая ситуевина
Код
C++ (Qt)
class MyClass {
...
 SomeClass m_data;   // этот член переносится в др поток
};
Записан
RedDog
Частый гость
***
Offline Offline

Сообщений: 221


Просмотр профиля
« Ответ #9 : Ноябрь 22, 2018, 09:37 »

С чего это, если парента никто не назначал?
Причем тут парент? Насколько я понял, у ТС такая ситуевина
Код
C++ (Qt)
class MyClass {
...
 SomeClass m_data;   // этот член переносится в др поток
};
Если человек задался вопросом про deleteLater() то логично было предположить, что он работает через указатели. Что я собственно и сделал.
Записан
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



Просмотр профиля
« Ответ #10 : Ноябрь 22, 2018, 11:32 »

Причем тут парент? Насколько я понял, у ТС такая ситуевина
...

Если человек задался вопросом про deleteLater() то логично было предположить, что он работает через указатели. Что я собственно и сделал.

Я делаю ставку, что там должен быть QPointer, кто больше? Улыбающийся Может лучше пусть ТС сам расскажет, что именно у него там находится, какая агрегация и зачем потоки.
Записан

Пока сам не сделаешь...
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3257


Просмотр профиля
« Ответ #11 : Ноябрь 22, 2018, 16:54 »

Может лучше пусть ТС сам расскажет, что именно у него там находится, какая агрегация и зачем потоки.

Тссс, телепаты вышли из отпуска.
Записан
sergek
Гипер активный житель
*****
Offline Offline

Сообщений: 861


Мы должны приносить пользу людям.


Просмотр профиля
« Ответ #12 : Ноябрь 22, 2018, 17:00 »

Коллеги, может просто рассмотрим варианты указателя и объекта? Не знаю, зачем это нужно, но ну его, этого ТС, просто интересно.  Подмигивающий
Записан

Qt 5.13.0 Qt Creator 5.0.1
Win10, Ubuntu 20.04
RedDog
Частый гость
***
Offline Offline

Сообщений: 221


Просмотр профиля
« Ответ #13 : Ноябрь 22, 2018, 17:07 »

Коллеги, может просто рассмотрим варианты указателя и объекта? Не знаю, зачем это нужно, но ну его, этого ТС, просто интересно.  Подмигивающий
Так уже все рассмотрели, ну кроме умных указателей.
ТСу есть из чего выбирать.
Записан
sergek
Гипер активный житель
*****
Offline Offline

Сообщений: 861


Мы должны приносить пользу людям.


Просмотр профиля
« Ответ #14 : Ноябрь 22, 2018, 17:52 »

Так уже все рассмотрели, ну кроме умных указателей.
Да? Может, я зря сомневаюсь, но если указатели, и послан сигнал на deleteLate объекта в другом потоке, то нужно ли контейнеру дожидаться, пока объект уничтожится?
Записан

Qt 5.13.0 Qt Creator 5.0.1
Win10, Ubuntu 20.04
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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