我可以轻松地用 C# 进行异步设计
HttpResponseMessage response = await httpClient.GetAsync(InputAddress.Text);
{
....// run when request finished. And response closely relation to request.
}
但是我怎样才能在QT中做到这一点呢?我在下面找到了一些代码。但还是有些疑问。
- 为什么(sentReply ==reply)可以判断是否相同呢?也许我可以发送相同的请求两次,请求A,请求B。相应的响应是A',B'。但响应到达的顺序是 B'、A'。代码是否有效?
-
如果我想在请求完成时运行一些代码(如上面的 C# 代码),我该怎么做?我想我可以为每个请求绑定一个UUID,或者为请求绑定一个回调函数指针?最好的方法是什么?
QNetworkAccessManager *manager=new QNetworkAccessManager(this);
connect(manager,SIGNAL(finished(QNetworkReply*)),this,SLOT(requestFinished(QNetworkReply*)));
QNetworkRequest request(QUrl(serverUrl));
QNetworkReply *sentReply = manager->post(request, buffer.toUtf8());
void requestFinished(QNetworkReply *reply)
{
QByteArray msg = reply->readAll();
if (sentReply == reply)
qDebug("this is it");
}
我建议如下:
使用动态属性将自定义属性添加到 QNetworkReply。
在完成的 Slot 中您可以访问它们并调用相应的方法。
Example:
QNetworkReply *reply =
networkAccessManager->get(QNetworkRequest(QUrl("http://url.com"));
reply->setProperty("login", QVariant("logindata");
connect(reply, SIGNAL(finished()), this, SLOT(replyFinished()));
回复完成槽:
QNetworkReply *reply = qobject_cast<QNetworkReply*>(sender());
if (reply) {
if (reply->error() == QNetworkReply::NoError) {
QString myCustomData = reply->property("login").toString();
if(myCustomData =="logindata")
//do something
}
reply->deleteLater();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)