освободить объекты, которые живут в только что завершившемся потоке, подключив сигнал finish () к QObject :: deleteLater () - PullRequest
0 голосов
/ 13 июня 2018

From: http://doc.qt.io/qt-5/qthread.html#details

Начиная с Qt 4.8, можно освобождать объекты, которые живут в только что завершившемся потоке, подключив сигнал finish () к QObject :: deleteLater().

Означает ли это, если я подключу сигнал завершения () к QObject :: deleteLater () Мне не придется беспокоиться об утечках памяти в рабочем потоке?

Какие объекты класса рабочего потока он собирается освободить самостоятельно?

connect(workerThread, &WorkerThread::finished, workerThread, &QObject::deleteLater); От: doc.qt.io/qt-5/qthread.html#details

Они показалиобъект рабочей нити, подключенный к слоту deleteLater.Теперь это означает, что все объекты, которые я выделяю в рабочем классе, будут автоматически удалены?

Ответы [ 2 ]

0 голосов
/ 13 июня 2018

Если QThread заканчивается (когда возвращается метод run()), он отправляет сигнал QThread::finished.Каждый QObject, чей слот deleteLater подключен к этому сигналу, удаляется.

Если вы подключаете сигнал QThread::finished() к методу QObject::deleteLater() рабочего объекта, как указано в документации к QThread (http://doc.qt.io/qt-5/qthread.html#details),, затем рабочий удаляется после завершения QThread. Все остальные QObjects, созданные вами внутри рабочего, будут существовать. Если вы хотите, чтобы они тоже были удалены, вам необходимо либо подключить их ктот же сигнал QThread :: finish (), либо вы используете механизм parent-child, устанавливая рабочий объект как родительский для другого объекта (либо передавая его как родительский в конструкторе (http://doc.qt.io/qt-5/qobject.html#QObject)), либо устанавливая егоявно с void QObject::setParent(QObject *parent) (http://doc.qt.io/qt-5/qobject.html#setParent).

0 голосов
/ 13 июня 2018

Какие объекты он собирается освободить самостоятельно?

Объекты, к которым вы подключили deleteLater слот.

Но у вас это, кажется, задом наперед: потоки и время жизни объектов являются ортогональными вопросами.Тот факт, что материал запускается в каком-то другом потоке, не означает, что он каким-то образом утечет, если только вы полностью не отказались от управления временем жизни объекта.

Представьте, что ваши объекты живут в основном потоке.Как вы будете управлять их жизнью?Сделайте то же самое в работнике.Также нет необходимости заканчивать время жизни объекта в рабочем потоке.Вы можете отправить их обратно в основной поток, завершить рабочий поток и уничтожить их в основном потоке.И т.д. Потоки не вносят здесь никаких новых проблем: у вас была проблема с самого начала.Решите это, затем добавьте многопоточность, и она не появится снова:)

...