QNetworkAccessManager 析构函数是否中止当前请求?

问题描述 投票:0回答:2

正在开发一个用户应该能够取消所有上传的应用程序。现在我想知道我是否必须追查 QNAM 的所有回复,或者只是删除它并期望它们全部中止?

文档中没有任何内容说明有关中止的任何内容,但我假设它会。

销毁 QNetworkAccessManager 对象并释放所有资源。请注意,从此类返回的 QNetworkReply 对象将此对象设置为其父对象,这意味着如果您不对它们调用 QObject::setParent() ,它们将随之被删除。

编辑: 最终为每个回复使用了一个包装器(它也获取了它的所有权并进行重试等),它在其析构函数中既断开了 QNetworkReplys 信号又中止了它。它与包装器一起被删除(父级->子级)

c++ qt qnetworkaccessmanager
2个回答
3
投票

它只会删除回复。来源:

QNetworkAccessManager::~QNetworkAccessManager()
{
    // ...

    qDeleteAll(findChildren<QNetworkReply *>());

    // ...
}

并且QNetworkReply的析构函数是空的,所以你需要手动中止它们。


0
投票

文档说销毁会在内部调用中止。但是,如果您有这样的连接:

// somewhere in the HttpRequestWorker
manager = new QNetworkAccessManager(this);
connect(manager, &QNetworkAccessManager::finished, this, &HttpRequestWorker::handle_reply);

handle_reply
不会通过
HttpRequestWorker
的销毁而被调用,因为连接依赖于
this
,所有关于
this
的连接都会在发出
QNetworkAccessManager::finished
信号之前被销毁。
解决方法是在销毁
HttpRequestWorker
类时手动调用 abort。

© www.soinside.com 2019 - 2024. All rights reserved.