Всем доброго дня!
У меня вопрос! Я хочу качать обновление с сервера в параллельном потоке, и тут притаилось черепашье "но". Он говорит что я пытаюсь с потоками мудить.
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 выводится в новом потоке, то почему программа подвисает и перестает реагировать, если нет, то почему выкидывает ошибочки.
Всем спасибо!