C++/Qt同步下载文件

标签 c++ qt networking

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

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/

相关文章:

c++ - 使用 find 方法后如何更新 std::map ?

c++ - NuGet with TeamCity for project shared by 2 solutions - .h file not found

python - 如何获取 Qt 小部件类型

C++多级继承

c++ - OpenGL 红皮书 - LoadShaders 坏了?

c++ - 文件名、目录名或卷标语法是来自 qt creator c++ 的不正确系统调用

qt - Qmake 处于发布和 Debug模式

docker - 将本地 Elixir/Erlang 连接到 Docker 容器内正在运行的应用程序

ios - Alamofire 回调永远不会返回

docker - 如何将实时 pcap 记录从 Kubernetes pod 传输到本地运行的 Wireshark?