Open myml opened 1 year ago
eventLoop 可用于同步等待信号,deleteLater 可以延迟删除对象,但不能在 eventLoop 之前使用 deleteLater。
因为 eventLoop 不会阻塞主线程事件,而 deleteLater 会在主线程下次循环时被调用,如果使用 eventLoop 等待对象的信号,而在 eventLoop.exec() 之前调用了对象的 deleteLater 方法,对象会被删除,eventLoop 永远无法等到对象的信号。
例子:
QNetworkRequest request(url); QNetworkReply *reply = m_http->get(request); reply->deleteLater(); // 错误 QEventLoop eventLoop; connect(reply, &QNetworkReply::finished, &eventLoop, &QEventLoop::quit); eventLoop.exec(); reply->deleteLater(); // 正确
eventLoop 可用于同步等待信号,deleteLater 可以延迟删除对象,但不能在 eventLoop 之前使用 deleteLater。
因为 eventLoop 不会阻塞主线程事件,而 deleteLater 会在主线程下次循环时被调用,如果使用 eventLoop 等待对象的信号,而在 eventLoop.exec() 之前调用了对象的 deleteLater 方法,对象会被删除,eventLoop 永远无法等到对象的信号。
例子: