QObject :: deleteLater через QThread - PullRequest
6 голосов
/ 09 марта 2012

Я ищу решение для планирования удаления объекта между потоками.Документы о поведении deleteLater не совсем ясны.Могу ли я вызвать эту функцию в потоке, который не является владельцем объекта?

Например, объект X принадлежит потоку A, а в потоке BI хотел бы удалить объект X.Поскольку объект может быть внутри обработки событий в данный момент (в потоке A), я не могу безопасно удалить его, пока он не вернется в цикл обработки сообщений.Если я вызываю deleteLater из потока B, однако документы, похоже, указывают, что он удалится, как только поток B вернется в цикл обработки сообщений.

В настоящее время я использую подход, при котором сигнал, излучаемый в потоке A,подключен к слоту, который вызывает deleteLater.Мне интересно, есть ли, возможно, более простой способ сделать это - если я действительно могу просто позвонить deleteLater из любого потока.

Ответы [ 3 ]

7 голосов
/ 09 марта 2012

Хотя deleteLater() сам по себе небезопасен, вы можете вызвать его в object threadA с помощью мета-вызова:

metaObject()->invokeMethod(object, "deleteLater", Qt::QueuedConnection);

Тогда это будет безопасно.

7 голосов
/ 15 января 2014

Глядя на код Qt 4 и Код Qt 5 , deleteLater() просто вызывает QCoreApplication::postEvent(), который явно объявлен поточно-ориентированным.Таким образом, должно быть хорошо просто позвонить напрямую.Поскольку очередь событий обрабатывается в потоке владельца объекта, удаление будет происходить в потоке A.

Если вы хотите полностью полагаться на документированное поведение, просто используйте postEvent().

0 голосов
/ 09 марта 2012

deleteLater() только означает, что объект будет удален после обработки всех сигналов / слотов в текущем цикле событий (т. Е. ThreadB).

Таким образом, если никакие другие слоты не нуждаются в ObjectX в ThreadB, онэквивалентно обычному delete.

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

Если ObjectX является основным объектомпотока, отправка сигнала quit() в ThreadA - это путь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...