Russian Qt Forum
Июня 21, 2025, 08:27
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Вопросы новичков
>
QNetworkReply::readyRead()
Страниц: [
1
]
2
3
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: QNetworkReply::readyRead() (Прочитано 15214 раз)
Алёна_4_12_1989
Гость
QNetworkReply::readyRead()
«
:
Марта 19, 2013, 13:15 »
Здравствуйте. У меня проблема. Я скачиваю большой файл на компьютер. Использую для этого сигнал QNetworkReply::finished(). Но при этом постоянно съедается оперативная память, так как насколько я поняла, она используется в этом классе. Как я могу сохранять файл по частям, используя readyRead() сигнал? Я не совсем это понимаю. Открыть файл, запустить QNetworkReply::get и ждать readyRead слот ? Но что делать в нем? Как сохранять и освобождать оперативку? Спасибо.
Записан
mutineer
Гость
Re: QNetworkReply::readyRead()
«
Ответ #1 :
Марта 19, 2013, 13:19 »
Цитировать
QNetworkReply is a sequential-access QIODevice, which means that once data is read from the object, it no longer kept by the device.
То бишь после прочтения из reply данных они больше не будут занимать память внутри reply
Записан
Алёна_4_12_1989
Гость
Re: QNetworkReply::readyRead()
«
Ответ #2 :
Марта 19, 2013, 13:29 »
т.е. при выходе из слота readyRead() память должна очищатся? или надо как-то считать эти данные? Я просто записываю их в файл, но в итоге программа делает crash из-за отсутствия памяти.
Записан
Bepec
Гость
Re: QNetworkReply::readyRead()
«
Ответ #3 :
Марта 19, 2013, 13:32 »
Кооод... нужен кооод... Покажи коооддд...
Записан
mutineer
Гость
Re: QNetworkReply::readyRead()
«
Ответ #4 :
Марта 19, 2013, 13:33 »
Не при выходе из слота, а при прочтении данных
Записан
Алёна_4_12_1989
Гость
Re: QNetworkReply::readyRead()
«
Ответ #5 :
Марта 19, 2013, 14:13 »
А как их прочесть?
Записан
Alex Custov
Джедай : наставник для всех
Offline
Сообщений: 2063
Re: QNetworkReply::readyRead()
«
Ответ #6 :
Марта 19, 2013, 14:32 »
reply->readAll()
Записан
Алёна_4_12_1989
Гость
Re: QNetworkReply::readyRead()
«
Ответ #7 :
Марта 19, 2013, 14:35 »
я использую reply->readAll() функцию класса QNetworkReply. Это правильно? Но при этом всё равно не работает.
А код вот:
reply = network_manager->get(QNetworkRequest(url));
connect(reply, SIGNAL(readyRead()), this, SLOT(ready_read_slot()));
void ready_read_slot()
{
reply->readAll(); // эти данные записываю в файл
}
Записан
mutineer
Гость
Re: QNetworkReply::readyRead()
«
Ответ #8 :
Марта 19, 2013, 14:38 »
"не работает" это очень распространенная проблема, да. Только универсального решения не придумали. Что и как не работает?
Записан
Алёна_4_12_1989
Гость
Re: QNetworkReply::readyRead()
«
Ответ #9 :
Марта 19, 2013, 14:41 »
ок, попробую конкретизировать. Спасибо.
Записан
Алёна_4_12_1989
Гость
Re: QNetworkReply::readyRead()
«
Ответ #10 :
Марта 19, 2013, 16:43 »
Программа падает на функции reply->readAll()
Первые два раза в слот readyRead программа заходит ( причем во втором случае количество bytesAvailible() больше, чем в первом - возможно это не новые данные, а все скачанные данные), а на третьем падает.
Записан
mutineer
Гость
Re: QNetworkReply::readyRead()
«
Ответ #11 :
Марта 19, 2013, 17:13 »
Покажи больше кода
Записан
Bepec
Гость
Re: QNetworkReply::readyRead()
«
Ответ #12 :
Марта 19, 2013, 17:16 »
Цитата: Bepec от Марта 19, 2013, 13:32
Кооод... нужен кооод... Покажи коооддд...
Записан
Алёна_4_12_1989
Гость
Re: QNetworkReply::readyRead()
«
Ответ #13 :
Марта 19, 2013, 17:34 »
Вот мой код.
void DownloadManager::startDownload()
{
if (network_manager)
{
m_reply = network_manager->get(QNetworkRequest(url));
connect(m_reply, SIGNAL(downloadProgress(qint64,qint64)), this, SLOT(download_progress(qint64, qint64)));
connect(m_reply, SIGNAL(readyRead()), this, SLOT(ready_read()));
connect(m_reply, SIGNAL(finished()), this, SLOT(finish_download()));
if (m_reply)
{
if (m_reply->error() == QNetworkReply::NoError)
{
file = new QFile();
if (file)
{
file->setFileName(fileName);
if (file->open(QIODevice::WriteOnly))
{
QByteArray my_array = m_reply->readAll();
int number = my_array.size();
m_reply->seek(0);
::write(file->handle(), my_array.data(), number);
http.setHost(url.host(), url.port(80));
http.get(url.toEncoded(QUrl::RemoveScheme | QUrl::RemoveAuthority));
}
}
}
}
}
}
void DownloadManager::ready_read()
{
if (m_reply)
{
qint64 value = m_reply->bytesAvailable();
if (file)
{
QByteArray my_array = m_reply->readAll();
int number = my_array.size();
::write(file->handle(), my_array.data(), number);
}
}
}
void DownloadManager::finish_download()
{
if (file)
{
::close(file->handle());
m_reply->deleteLater();
delete file;
}
}
Записан
mutineer
Гость
Re: QNetworkReply::readyRead()
«
Ответ #14 :
Марта 19, 2013, 17:41 »
А для чего делается m_reply->seek(0); ? Он же бессмысленен для последовательных девайсов
Записан
Страниц: [
1
]
2
3
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...