【发布时间】:2016-11-05 20:56:22
【问题描述】:
我使用了像 doc http://doc.qt.io/qt-4.8/qnetworkaccessmanager.html 这样的例子
我创建了一个startDownload:
connect(pushButton, SIGNAL(clicked(bool)), this, SLOT(startDownload(bool)));
在startDownload(bool)我放了这个:
file = new QFile("C:/foo/bar/bigfile.7z");
file->open(QIODevice::WriteOnly);
QNetworkRequest request;
request.setUrl(QUrl("http://localhost/bigfile.7z"));
request.setRawHeader("User-Agent", "MyOwnBrowser 1.0");
QNetworkReply *reply = manager->get(request);
connect(reply, SIGNAL(readyRead()), this, SLOT(slotReadyRead()));
connect(reply, SIGNAL(error(QNetworkReply::NetworkError)),
this, SLOT(slotError(QNetworkReply::NetworkError)));
connect(reply, SIGNAL(sslErrors(QList<QSslError>)),
this, SLOT(slotSslErrors(QList<QSslError>)));
在slotReadyRead我放了这个:
file->write(reply->readAll());
但是下载到最后会出现2秒的小卡顿,然后恢复正常,下载完成。仅当我尝试传输的文件很大时才会出现此问题。
【问题讨论】:
-
我试图为您的问题写一个minimal example。我计算了每个
file->write(reply->readAll())调用的时间,大多数调用花费了 0 毫秒,最后一次调用(在下载结束时)没有你描述的显着差异(我尝试了我的本地文件的代码大约 1GB 大小的网络)。也许是代码中的另一件事使事情变慢?尝试测量函数调用的持续时间,以确保确实是这个调用导致了问题。 -
@Mike 这个问题只出现在 GUI 应用程序中,例如
QMainWindow -
问题出现在 GUI 中,因为回调花费了 很多 时间来完成并返回到事件循环。在我的测试中,我只是测量在
file->write(reply->readAll());中花费的时间,以确保下载结束时确实需要 2 秒。但事实证明,其实用不了那么长时间,你的输出不一样吗? -
@Mike 18mb => i.stack.imgur.com/qSU2n.png in online server, 300mb in localhost => i.stack.imgur.com/m58Wn.png 我认为问题因网络而异。
-
@Mike 是的,看看没有 setReadBufferSize => i.stack.imgur.com/OxhdH.png, with setReadBufferSize => i.stack.imgur.com/bMZQQ.png 我正在做一些测试,会准备一个答案。