c++ - QNetworkReply::finished() 信号是顺序调用还是同时调用?
问题描述
这是一种HTTP请求发送方法。当目标网站响应时,将调用 httpFinished()。
void HTTPClientBase:: HttpRequestGet()
{
QNetworkRequest network_request;
network_request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded");
network_request.setUrl(URL);
reply = network_manager.get(network_request);
connect(reply, SIGNAL(finished()), this, SLOT(httpFinished()));
}
void HTTPClientBase::httpFinished()
{
// process the reply;
}
我可以循环调用 HttpRequestGet() 。
static HTTPClientBase myClient;
for(...)
{
myClient.setUrl(...);
myClient.HttpRequestGet();
}
由于请求和响应是异步的,所以循环可以在瞬间完成。几百毫秒后,会依次调用httpFinished()。
我想知道 httpFinished() 将被顺序或同时调用。换句话说,如果我需要关注同时编程问题,例如,将响应数据写入单个文件。
解决方案
以下语句表明 httpFinished 方法不会同时执行多次:
- 当没有执行同步任务时调用槽。
- HTTPClientBase 是一个存在于线程中的 QObject,因此执行其任何方法都意味着您无法执行另一个任务。
- 您所做的任务不仅仅是并发,而是异步。
- 从设计的角度来看,Qt 的异步性是有效的,但实际上是同步执行其任务。
- 在一个线程中,一次只能执行一项任务,而 httpFinished 在 HTTPClientBase 所在的线程中执行。
推荐阅读
- excel - 如何用 Condition 组合 Offset 函数?
- bash - 如何使用没有循环的bash从数组中获取单个值
- c# - ASP.NET Core API 的 ProducesResponseType 属性中包含的正确类型是什么?
- javascript - 如何链接 JavaScript 文件?
- python - 如何在“map”函数调用中将参数传递给函数?
- javascript - 如何选择父节点的第一个子节点?
- java - 我们可以通过 Streaming 和 mapping 抛出两个异常吗?
- reactjs - 根据用户权限显示菜单列表
- python - 如何计算采购订单行中每列的平均价格?
- c# - ActionFilterAttribute - 当顺序很重要时