S>Конечно же нет
S>S>QObject::~QObject()
S>All signals to and from the object are automatically disconnected, and any pending posted events for the object are removed from the event queue.
Про disconnect и очистку очереди понятно. Я говорил про те эвенты, которые уже взяты из очереди и продолжают выполняться.
M>>А что насчет событий, которые сгенерированы удаляемым объектом? deleteLater ждёт пока все подписчики их обработают?
S>Да, это же легко проверить:
В это примере emitter и receiver это один и тот же объект.
И очередь обработки событий у него одна. Т.е. обработка deleteLater всегда будет выполняться после обработки mySignal.
Меня же интересует скорее такой сценарий:
| | код |
| | #include <QObject>
#include <QDebug>
#include <QCoreApplication>
#include <QTimer>
#include <QThread>
#include <QEventLoop>
class Object : public QObject
{
Q_OBJECT
signals:
void mySignal();
public:
Object(QObject *parent = nullptr) : QObject(parent)
{
}
void emitSignal() {
mySignal();
}
};
int main(int argc, char *argv[]) {
QCoreApplication app(argc, argv);
auto *obj1 = new Object();
auto *obj2 = new Object();
QThread thr{};
thr.start();
obj2->moveToThread(&thr);
QObject::connect(obj1, &QObject::destroyed, obj1, []{ qDebug() << "Object destroyed"; });
QObject::connect(obj1, &Object::mySignal, obj2, []{
qDebug() << "Signal received";
QThread::sleep(5);
qDebug() << "Signal received2";
});
obj1->emitSignal();
QThread::sleep(2);
obj1->deleteLater();
return app.exec();
}
#include "main.moc"
Signal received
Object destroyed
Signal received2
|
| | |
S>Типичные случаи когда надо использовать deleteLater:
S>
S>1. Из слота самого объекта
S>2. Между потоками (но обычно это признак пробленого дизайна)
S>3. Асинхронные обработчики событий QNetworkReply
S>4. QThread::finished -> deleteLater
S>
В моем проекте в основном работа с сетью. Пункт 3.