如何确保 QNetworkReply::finished 真的被抓到
How to ensure that QNetworkReply::finished really is catched
当我有这样的代码时:
QNetworkReply* reply = netWorkMansger.post(...);
connect(reply,&QNetworkReply::finished,[=](){//Handler code});
如果在第一行和第二行之间回复完成怎么办?连接来晚了,不是吗?
如果回复在创建期间发出 finished(),在回复指针返回给 post() 的调用者之前,connect() 确实来不及了。
QNetworkReply/QNetworkAccessManager 不要那样做,回复的网络操作的开始是 queued 在事件循环中,即操作不会在您的代码 returns 之前开始到事件循环或事件以其他方式处理(否则意味着显式调用一些讨厌的方法之一,如 QDialog::exec()/QMessageBox::critical 等,QEventLoop::exec() 或 processEvents()) .因此,如果您立即连接到回复,您的代码是安全的。
在我看来,在启动异步操作时不同步发出 finished() 之类的信号是实现此类操作时最重要的规则之一。
当我有这样的代码时:
QNetworkReply* reply = netWorkMansger.post(...);
connect(reply,&QNetworkReply::finished,[=](){//Handler code});
如果在第一行和第二行之间回复完成怎么办?连接来晚了,不是吗?
如果回复在创建期间发出 finished(),在回复指针返回给 post() 的调用者之前,connect() 确实来不及了。
QNetworkReply/QNetworkAccessManager 不要那样做,回复的网络操作的开始是 queued 在事件循环中,即操作不会在您的代码 returns 之前开始到事件循环或事件以其他方式处理(否则意味着显式调用一些讨厌的方法之一,如 QDialog::exec()/QMessageBox::critical 等,QEventLoop::exec() 或 processEvents()) .因此,如果您立即连接到回复,您的代码是安全的。
在我看来,在启动异步操作时不同步发出 finished() 之类的信号是实现此类操作时最重要的规则之一。