Я пытаюсь разобратся с агрегатным использованием мультипоточности, и уже совсем запутался какой объект в каком потоке находится.
Вот код при нажатии кнопки:
void MainWindow::on_pushButton_clicked()
{
QThread* thread = new QThread();
thread->start();
Worker* work = new Worker; // наследован от QObject
work->moveToThread(thread);
work->doWork1();
}
Вот класс Worker
H:
#ifndef WORKER_H
#define WORKER_H
#include <QObject>
#include <QThread>
#include <QtNetwork/QNetworkAccessManager>
#include <QUrl>
#include <QtNetwork/QNetworkRequest>
#include <QtNetwork/QNetworkReply>
#include <QDebug>
class Worker : public QObject
{
Q_OBJECT
public:
explicit Worker(QObject *parent = 0);
void doWork1();
QNetworkAccessManager* manager;
signals:
public slots:
void doWork2(QNetworkReply* reply);
void doWork3(QNetworkReply* reply);
};
#endif // WORKER_H
CPP:
#include "worker.h"
Worker::Worker(QObject *parent) :
QObject(parent)
{
}
void Worker::doWork1()
{
qDebug()<<"Start work 1";
manager = new QNetworkAccessManager();
connect(manager,SIGNAL(finished(QNetworkReply*)),this,SLOT(doWork2(QNetworkReply*)));
manager->get(QNetworkRequest(QUrl("http://ya.ru")));
qDebug()<<"End work 1";
}
void Worker::doWork2(QNetworkReply *reply)
{
qDebug()<<"Start work 2";
QByteArray b = reply->readAll();
disconnect(manager,SIGNAL(finished(QNetworkReply*)),this,SLOT(doWork2(QNetworkReply*)));
connect(manager,SIGNAL(finished(QNetworkReply*)),this,SLOT(doWork3(QNetworkReply*)));
manager->get(QNetworkRequest(QUrl("http://mail.ru")));
qDebug()<<"End work 2";
}
void Worker::doWork3(QNetworkReply *reply)
{
qDebug()<<"Start work 3";
QByteArray b = reply->readAll();
qDebug()<<"End work 3";
}
Когда я нажимаю в окне кнопку - создается новый поток, создается объект класса
Worker (в его конструкторе ничего не создается), стартует поток, потом Worker перемещается в созданный поток и запускается процедура "
Work1".
В этой процедуре создается
QNetworkAccessManager и передает
GET запрос куда-то там.
Возвращается
QNetworkReply в процедуру "
Work2", в которой этот менеджер делает новый запрос GET.
Вот почемуто, когда менеджер делает новый запрос
GET в процедуре "
Work2" - лезут сообщения "
Cannot create children for a parent that is in a different thread."
Не могу понять почему, ведь и QNetworkAccessManager был создан в потоке. Получается что QNetworkReply возвращается в другом потоке? Почему? Как с этим боротся?
Исходники прилагаются:
http://www.fayloobmennik.net/1672364