я использовал пример, как док http://doc.qt.io/qt-4.8/qnetworkaccessmanager.htmlСкачать большие файлы с QNetworkReply :: 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 секунд, а затем возвращается в нормальное состояние и загрузка завершена. Эта проблема возникает только в том случае, если файл, который я пытаюсь передать, большой.
Я попытался написать [минимальный пример] (http://pastebin.com/et94k1Uk) для вашей проблемы. Я вычислил время для каждого 'file-> write (reply-> readAll())' call, большинство вызовов заняло 0 мс, последний вызов (в конце загрузки) не имел существенной разницы, поскольку вы описываете (Я пробовал код с локальным файлом в моей сети размером около 1 ГБ). Может быть, это другое дело в вашем коде, что замедляет работу?попробуйте измерить длительность вызовов функций, чтобы убедиться, что это действительно этот вызов, который вызывает проблему. – Mike
@Mike проблема возникает только в приложениях GUI, например, с 'QMainWindow' –
Проблема возникает в графическом интерфейсе, потому что обратный вызов занимал * много * времени для завершения и возвращался обратно в цикл событий. В своем тесте я просто измеряю количество времени, затраченного на 'file-> write (reply-> readAll());' чтобы убедиться, что на самом деле это занимает 2 секунды в конце загрузки. Но оказалось, что на самом деле это не так долго, а выход отличается от вашего? – Mike