Re[6]: Про QObject::deleteLater()
От: m2user  
Дата: 10.10.25 14:56
Оценка:
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.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.