【问题标题】:What is the correct way to "stop / shutdown" a QNetworkAccessManager?“停止/关闭” QNetworkAccessManager 的正确方法是什么?
【发布时间】:2016-02-27 15:16:46
【问题描述】:

我有一个 QNetworkAccessManager 。假设我有一个待处理的请求:

QNetworkRequest request(url);
this->m_networkManager->get(request)

我可以随时关闭QNetworkAccessManager 吗?我之所以问,是因为在挂起的获取请求期间,当我破坏我的对象 m_networkManager 时,我看到了 write access violation。

或者我怎样才能安全地销毁管理器,似乎没有停止或关闭功能。

【问题讨论】:

  • 您是否尝试在从QNetworkManager::get() 返回的QNetworkReply 上调用abort()?
  • 感谢您的提示。我想到的一种解决方法,但这有点不方便,因为我必须存储所有请求,直到它们最终在接收槽中处理。在那里我必须将它们从临时列表中删除,因为接收槽需要销毁请求。
  • 实际上,现在我查看文档,删除 QNetworkAccessManager 会破坏其所有待处理的 QNetworkReply 实例,而这些实例又应该关闭它们的所有连接。所以简单地删除QNetworkAccessManager 应该没问题。我不知道您为什么会看到访问冲突——这可能是无关的。
  • 可能是,将重新阅读文档,感谢您提供的信息。奇怪的是,只有在我有待处理的请求时才会发生这种情况。

标签: qt access-violation qnetworkaccessmanager qt5.5


【解决方案1】:

根本原因是我们的QNetworkAccessManager 用在了一个线程工作者(1)中。所以很明显,当QNetworkAccessManager 被删除,并且在这一步(并且只有在那时)清理挂起的QNetworkReply 对象时,问题就出现了。

分析: 没有待处理的回复,或者在主线程中使用时,在同一场景中没有问题。如果在将 QNetworkAccessManager 移回主线程之前将其删除,则可以避免此问题。结论(或推测):当QNetworkAccessManager 尝试删除在不同线程中创建的QNetworkReply 时会出现此问题。

(1) 可以理解,请求是异步执行的——我们对线程工作者有很好的设计理由。

【讨论】:

    猜你喜欢
    • 2012-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-05
    • 2015-09-02
    • 2023-04-09
    • 2011-03-21
    相关资源
    最近更新 更多