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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QThread и QNetworkRequestManager  (Прочитано 3234 раз)
WILY
Гость
« : Январь 28, 2016, 16:48 »

Всем доброго дня!

У меня вопрос! Я хочу качать обновление с сервера в параллельном потоке, и тут притаилось черепашье "но". Он говорит что я пытаюсь с потоками мудить.

update.h
Код
C++ (Qt)
#include <QWidget>
#include <updatethread.h>
#include <QHttpResponseHeader>
#include "QHttp"
#include <QDebug>
#include <QFile>
#include <QUrl>
 
 
namespace Ui {
class Updater;
}
 
 
class Updater : public QWidget
{
   Q_OBJECT
 
public:
   explicit Updater(QWidget *parent = 0);
   updateThread myThread;
   ~Updater();
 
 
private:
   Ui::Updater *ui;
};
 


Updater.cpp
Код
C++ (Qt)
Updater::Updater(QWidget *parent) :
   QWidget(parent),
   ui(new Ui::Updater)
{
   ui->setupUi(this);
   myThread.start();
}
 
Updater::~Updater()
{
   delete ui;
}
 

updatethread.h
Код
C++ (Qt)
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QThread>
#include <QDebug>
#include <QFile>
 
class updateThread : public QThread
{
   Q_OBJECT
public:
   updateThread();
   void setFile();
   void run();
   QNetworkReply * reply;
   QNetworkRequest * request;
 
private:
   QNetworkAccessManager* manager;
   QString Name, Online_adress;
 
signals:
   void finished();
 
public slots:
   void onDownloadProgress(qint64 bytesRead,qint64 bytesTotal);
   void slot_netwManagerFinished(QNetworkReply * reply);
   void exit();
 
};


updatethread.cpp
Код
C++ (Qt)
#include "updatethread.h"
 
updateThread::updateThread()
{
   Online_adress="http:/.....file.exe";
   manager = new QNetworkAccessManager();
   request = new QNetworkRequest(Online_adress);
 
 
}
 
 
void updateThread::setFile()
{
   reply = manager->get(*request);
   connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(slot_netwManagerFinished(QNetworkReply*)));
   connect(reply, SIGNAL(downloadProgress(qint64,qint64)),this ,SLOT(onDownloadProgress(qint64,qint64)));
 
}
 
void updateThread::onDownloadProgress(qint64 bytesRead,qint64 bytesTotal)
{
   qDebug(QString::number(bytesRead).toLatin1() +" - "+ QString::number(bytesTotal).toLatin1());
}
 
void updateThread::slot_netwManagerFinished(QNetworkReply * reply)
{
   if (reply->error() != QNetworkReply::NoError) {
       qDebug() << "Error in" << reply->url() << ":" << reply->errorString();
       return;
   }
   QFile file("HelpMe_last.exe");
   if (!file.open(QIODevice::WriteOnly))
   {
       qDebug() << "Could not open %s for writing: %s\n";
   }
   file.write(reply->readAll());
   file.close();
}


Бросается вот такими ошибками

QObject: Cannot create children for a parent that is in a different thread.
(Parent is QNetworkAccessManager(0x3e9620), parent's thread is QThread(0x3e52e0), current thread is updateThread(0x22fe7c)

Хочу понять, если QNetworkRequestManager выводится в новом потоке, то почему программа подвисает и перестает реагировать, если нет, то почему выкидывает ошибочки.

Всем спасибо!
« Последнее редактирование: Январь 29, 2016, 09:59 от WILY » Записан
ksk-
Самовар
**
Offline Offline

Сообщений: 178



Просмотр профиля
« Ответ #1 : Январь 29, 2016, 07:21 »

Напрасно ты наследуешься от QThread. Да и пытаться вынести QNetworkAccessManager тоже смысла большого нет. Да и вообще всё неправильно!
Записан
torwig
Самовар
**
Offline Offline

Сообщений: 134



Просмотр профиля
« Ответ #2 : Январь 29, 2016, 09:21 »

Попробуйте создавать QNetworkAccessManager и т.п. не в конструкторе, а в методе run().
Загружает оно асинхронно, поэтому и без отдельного потока можно было. - наверное об этом хотел написать человек выше.
Записан
WILY
Гость
« Ответ #3 : Январь 29, 2016, 09:59 »

Всем доброго утра! )

Я читал что QNetworkAccessManager работает асинхронно, но у меня тогда возникает резонный вопрос, почему во время загрузки файла окно становится неактивным и не отвечает на любые действия.
« Последнее редактирование: Январь 29, 2016, 10:03 от WILY » Записан
ksk-
Самовар
**
Offline Offline

Сообщений: 178



Просмотр профиля
« Ответ #4 : Январь 29, 2016, 10:45 »

Всем доброго утра! )

Я читал что QNetworkAccessManager работает асинхронно, но у меня тогда возникает резонный вопрос, почему во время загрузки файла окно становится неактивным и не отвечает на любые действия.

Всё будет зависеть от того, как ты сохраняешь данные. Судя по коду выше (метод "slot_netwManagerFinished"), ты пытаешься записать все загруженные данные разом. Скорее всего, именно этот метод блокирует UI.
Записан
WILY
Гость
« Ответ #5 : Январь 29, 2016, 10:49 »

Я так понимаю что он вызывает метод записи в файл после завершения загрузки всех пакетов. А UI блокируется уже во время загрузки
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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