我一樣使用文檔例如http://doc.qt.io/qt-4.8/qnetworkaccessmanager.html下載大文件:: readAll凍結幾秒鐘
我創建了一個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](http://pastebin.com/et94k1Uk)。我計算了每個'file-> write(reply-> readAll())'調用的時間,大多數調用花費了0毫秒,最後一次調用(在下載結束時)沒有像描述的那樣有顯着差異(我試了我的網絡上的一個本地文件的代碼大小約爲1GB)。也許這是你的代碼中的另一件事情,讓事情變得緩慢?嘗試測量函數調用持續時間,以確保確實是導致問題的這個調用。 – Mike
@Mike問題只出現在GUI應用程序中,例如'QMainWindow' –
問題發生在GUI中,因爲回調需要花費很多時間才能完成並返回到事件循環。在我的測試中,我只是測量'file-> write(reply-> readAll());'花費的時間,以確保它在下載結束時真的需要2秒。但事實證明,這並不是真的需要那麼長時間,你的輸出是不同的? – Mike