QNetworkAccessManager 从 Internet 崩溃中下载图像预览

Posted

技术标签:

【中文标题】QNetworkAccessManager 从 Internet 崩溃中下载图像预览【英文标题】:QNetworkAccessManager to download image previews from the Internet crashes 【发布时间】:2015-11-13 21:46:38 【问题描述】:

我有 QListWidget,其中的每个自定义小部件都包含一个标签,该标签使用每个自定义小部件中定义的 QNetworkAccessManager 从 Internet 获取它的 QPixmap。

当有 10、20、30 个小部件添加到 QListWidget 时,一切正常。

当小部件的数量(每个小部件都有 QNetworkAccessManager 从 Internet 加载图像)达到 300/400 时,应用程序就会崩溃。线程错误到达。

当应用程序中有很多(300-2000)个 QNetworkAccessManagers 同时从 Internet 加载图像时,如何避免线程错误?

我正在使用 Qt 5.5

【问题讨论】:

【参考方案1】:

通常每个应用程序只需要一个QNetworkAccessManagers。能够同时管理多个并行连接是相当重的对象。它还管理套接字和会话,因此对同一服务器的所有 HTTP 请求都可以由单个(或几个;它是可配置的)TCP 连接来维护(一旦请求完成,TCP 连接不会关闭,并且下一个请求会在相同的连接)。

创建QNetworkAccessManagers 的许多实例的通常原因是处理来自不同连接的异步信号的麻烦。 请注意,可以将不是来自QNetworkReply 的信号连接到适当的插槽。

函数QNetworkAccessManager::get()QNetworkAccessManager::post() 返回指向负责该请求的QNetworkReply 对象的指针。 QNetworkReply 对象的信号可以连接到相应小部件的插槽。因此,一旦该回复完成,它将仅触发一个特定的小部件插槽,例如参见 Singleton QNetworkAccessManager not directing the response to desired form

【讨论】:

我也尝试过只有一个 QNetworkAccessManager 并有一个分配给 this 的插槽,这是完成的()信号 connect(mainWindow->thumbsNetworkAccessManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(slot_netwManagerFinished(QNetworkReply*))); 但是在这种情况下我get 是第一个多次更新图像的小部件,而不是这 300-400 个小部件中的每一个都更新了它们的每个图像 @Zelid 最好不要连接QNetworkAccessManagers,而是直接连接QNetworkReply 与所需的小部件。我更新了我的答案。 谢谢!那工作得很好。来自 QNetworkReply 的 finished() 信号连接到将处理接收到的数据的插槽,并且发送者被动态转换为 QNetworkReply - 然后一切都会发生

以上是关于QNetworkAccessManager 从 Internet 崩溃中下载图像预览的主要内容,如果未能解决你的问题,请参考以下文章

QT 从 QWebView 的 QNetworkAccessManager 读取数据

QNetworkAccessManager 可以从不同的线程获取/发布吗?

QNetworkAccessManager:从串行 QIODevice 发布 http 多部分

如何从 QNetworkAccessManager::networkAccessibleChanged() 获得信号?

QNetworkAccessManager 从 Internet 崩溃中下载图像预览

在 QNetworkAccessManager 中,何时从解析 DNS 的 IP 列表中选择 IP?