Russian Qt Forum
Июнь 15, 2024, 23:17 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2] 3   Вниз
  Печать  
Автор Тема: QNetworkReply::readyRead()  (Прочитано 14283 раз)
Алёна_4_12_1989
Гость
« Ответ #15 : Март 19, 2013, 17:44 »

понятно. спасибо, уберу.
Записан
Алёна_4_12_1989
Гость
« Ответ #16 : Март 19, 2013, 17:46 »

но это не решило проблему. не могу пока понять в чем дело.
Записан
mutineer
Гость
« Ответ #17 : Март 19, 2013, 17:46 »

И еще вопрос: почему используются ::write и ::close вместо функций QFile?
Записан
mutineer
Гость
« Ответ #18 : Март 19, 2013, 17:47 »

но это не решило проблему. не могу пока понять в чем дело.
Я и не говорил что это решит проблему, просто странности в коде, интересно откуда у них ноги растут. Может наведет на мысли
Записан
Алёна_4_12_1989
Гость
« Ответ #19 : Март 19, 2013, 17:51 »

раньше не разобралась почему, но QFile не работал. Поэтому заменила на сишные функции. Но сейчас вижу, вроде QFile тоже работает. Но вот почему-то reply->readAll() падает((
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #20 : Март 19, 2013, 18:16 »

почему ты после вызова network_manager->get(QNetworkRequest(url)); сразу же проверяешь m_reply->error()? Скачивание будет происходить асинхронно, и завершится по сигналу finished(). Во-вторых, все точки назначения, куда нужно записывать полученные данные (типа переменной file), должны быть созданы до того, как ты делаешь network_manager->get(QNetworkRequest(url)), потому что данные могут прийти сразу же, а переменная file ещё не создана, и я даже подозреваю, что не занулена в конструкторе DownloadManager.
Записан
Алёна_4_12_1989
Гость
« Ответ #21 : Март 20, 2013, 09:49 »

Я обнуляю указатель на файл в конструкторе. Спасибо за замечания. Я исправила эти моменты. К сожалению, программа всё еще падает. Я стараюсь найти ошибку.
Записан
Bepec
Гость
« Ответ #22 : Март 20, 2013, 09:52 »

Кооод... нужен кооод... Покажи коооддд...

PS выложи весь проект.
Записан
Алёна_4_12_1989
Гость
« Ответ #23 : Март 20, 2013, 10:13 »

Вот код всего donwloadera.




h file

#ifndef DOWNLOADMANAGER_H
#define DOWNLOADMANAGER_H

#include <QObject>
#include <QUrl>
#include <QHttp>

class QNetworkAccessManager;
class QNetworkReply;
class QFile;

class DownloadManager : public QObject
{
    Q_OBJECT
public:
    DownloadManager(QObject *parent = 0);
    ~DownloadManager();
    void download(QUrl &url, QString fileName);
    void download(QString fileName);
    void setUrl(QUrl &url);

private:
    void startDownload();

    QUrl url;
    QNetworkAccessManager* network_manager;
    QNetworkReply *m_reply;
    QHttp http;
    QString fileName;
    QFile *file;

signals:

private slots:
    void onNetworkReply(QNetworkReply*);
    void quit(bool);
    void download_progress(qint64,qint64);
    void ready_read();
    void finish_download();

};

#endif // DOWNLOADMANAGER_H











cpp file

#include "downloadmanager.h"
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>

DownloadManager::DownloadManager(QObject *parent) :
    QObject(parent)
{
    network_manager = 0;
    network_manager = new QNetworkAccessManager(this);
    if (network_manager)
        connect(network_manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(onNetworkReply(QNetworkReply*)));
    connect(&http, SIGNAL(done(bool)), this, SLOT(quit(bool)));
    file = 0;
}

DownloadManager::~DownloadManager()
{
    delete network_manager;
}

void DownloadManager::download(QUrl &url, QString fileName)
{
    this->url = url;
    this->fileName = fileName;
    startDownload();
}

void DownloadManager::download(QString fileName)
{
    this->fileName = fileName;
    startDownload();
}

void DownloadManager::setUrl(QUrl &url)
{
    this->url = url;
}

void DownloadManager::startDownload()
{
    if (network_manager)
    {
        file = new QFile();
        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 (file)
            {
                file->setFileName(fileName);
                if (file->open(QIODevice::WriteOnly))
                {
                    http.setHost(url.host(), url.port(80));
                    http.get(url.toEncoded(QUrl::RemoveScheme | QUrl::RemoveAuthority));
                }
            }
        }
    }
}

void DownloadManager::onNetworkReply(QNetworkReply *reply)
{

}

void DownloadManager::quit(bool)
{

}

void DownloadManager::download_progress(qint64 bytesReceived, qint64 bytesTotal)
{

}

void DownloadManager::ready_read()
{
    if (m_reply)
    {
        if (m_reply->error() == QNetworkReply::NoError)
        {
            qint64 value = m_reply->bytesAvailable();
            if (file)
                file->write(m_reply->readAll());
        }
    }
}

void DownloadManager::finish_download()
{
    if (file && m_reply)
    {
        file->close();
        m_reply->deleteLater();
        delete file;
        file = 0;
    }
}
Записан
mutineer
Гость
« Ответ #24 : Март 20, 2013, 11:04 »

Код
C++ (Qt)
delete network_manager;
Не надо этого делать - будет двойное удаление. network_manager будет разрушен своим родителем

Кроме того не надо сразу после get что-то читать из reply, читай по сигналу ready_read. И для чего тут протухший QHttp?
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #25 : Март 20, 2013, 14:36 »

Код
C++ (Qt)
delete network_manager;
Не надо этого делать - будет двойное удаление.
Да ну перестаньте. Никакого двойного удаления не будет. Подмигивающий
Сколько лет это обсуждается...
Записан
Алёна_4_12_1989
Гость
« Ответ #26 : Март 20, 2013, 14:38 »

Спасибо. Я снова поправила. По-прежнему падает. Адрес m_reply остается постоянным всегда, почему падает не понимаю.
Записан
mutineer
Гость
« Ответ #27 : Март 20, 2013, 14:45 »

Код
C++ (Qt)
delete network_manager;
Не надо этого делать - будет двойное удаление.
Да ну перестаньте. Никакого двойного удаления не будет. Подмигивающий
Сколько лет это обсуждается...

Это не повод писать ненужный код
Записан
Bepec
Гость
« Ответ #28 : Март 20, 2013, 15:18 »

А давайте зададим вопрос - зачем вы используете QHttp?

И зачем вызываете у него метод get?

И... И... И зачем вам стока пустых слотов Веселый

Код:
void deleteTmpNetwar::startDownload()
{
if (network_manager)
{
file = new QFile();
file->setFileName(fileName);
file->open(QIODevice::WriteOnly);
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()));
}
}

И закачка 70 мегов прошла спокойно без эксцессов. Память съедалась на целых + 5 кб больше, чем при простое.

PS а ответ прост, класс QHttp у вас качал тот же файл. А вы с него не читали. И он качал в память. И его опять не читали... И всё Веселый Дальше он не выдерживал и умирал наверно )
« Последнее редактирование: Март 20, 2013, 15:23 от Bepec » Записан
Алёна_4_12_1989
Гость
« Ответ #29 : Март 21, 2013, 12:39 »

Большое спасибо. Да, наверное, http лишнее будет. Вообще, я посмотрела, что установка размера буфера в 10 Мегабайт позволила решить проблему. Но я не уверена, что она не вылезет в будущем.
Записан
Страниц: 1 [2] 3   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.103 секунд. Запросов: 22.