gpt4 book ai didi

C++/Qt同步下载文件

转载 作者:太空宇宙 更新时间:2023-11-04 12:27:10 24 4
gpt4 key购买 nike

我想实现在单独的线程中下载文件并存储该文件,但是我无法找到一种合适的方法来实现这一点而不会造成邪恶的延迟(小文件的下载非常频繁,所以信号+插槽太慢了)。我想要实现的目标:(伪代码)

request file;
wait for download finishing, timeout or error;
save downloaded file;

如果可能的话,我更喜欢 QNetworkAccessManager 的例子。感谢您的任何提示。

编辑:明确一点,我想要信号和插槽不是因为设计以及缺乏速度。

Edit2:本次下载只是同步部分的下载文件,线程没问题。问题是 QT 不提供这样做的 api,我不热衷于热旋转等待。

Edit3:类似的示例代码应该可以工作,但不能:

QNetworkAccessManager net;
QNetworkReply *re (net.get( QNetworkRequest( QUrl( Qstring("www.blah.org/key") ) ) ));
if (re->waitForReadyRead(-1)) //! @bug this does not work as supposed, waitForRead returns false and returns INSTANTLY!!
qDebug() << "ReadyRead yeha!!!";
if (re->error()) {
qDebug() << "Can't download" << re->url().toString()
<< ":" << re->errorString();
} else {
img->load(re->readAll());
qDebug() << "Savin IMG";
}
delete re;

最佳答案

我需要类似但出于不同原因的东西。由于 QHttp 和 QNetworkAccessManager 都是异步的,您可以做的是使用单独的事件循环,可以找到基于 QHttp 的完整示例 here .为 QNetworkAccessManager 修改它应该不会太困难。

值得一提的是,您认为信号/槽“慢”的印象可能是错误的。您是否真的分析了您的代码来确定这一点?

无论您为信号/插槽付出的代价是什么,从单个文件下载所花费的时间来看,它都可以忽略不计。更重要的是,以这种方式做事是非常“非Qt”的。这些类的设计是有原因的。

归根结底,如果您确实受到信号/插槽的困扰(再次怀疑),我建议不要将 Qt 用于此特定任务,也许是普通的旧 C 套接字是一个更好的主意(或者围绕它们进行薄包装以节省可能需要一些额外工作的错误处理)。

关于C++/Qt同步下载文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1663655/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com