把一个QNetworkAccessManager对象用moveToThread()函数move到一个新
线程的时候
貌似move得不彻底。QNetworkAccessManager内部的某些子对象不会move到新线程
先上代码,不长
运行的时候最好把网断了,这样结果看得更清楚一些
myobject.h:
- #ifndef MYOBJECT_H
- #define MYOBJECT_H
- #include <QObject>
- #include <QtNetwork/QNetworkAccessManager>
- #include <QtNetwork/QNetworkReply>
- #include <QtNetwork/QNetworkRequest>
- #include <QDebug>
- #include <QThread>
- #include <QEventLoop>
- class MyObject : public QObject
- {
- Q_OBJECT
- public:
- explicit MyObject(QObject *parent = 0):QObject(parent){
- manager = new QNetworkAccessManager(this);
- }
- public slots:
- void work(){
- qDebug() << "current thread: " << QThread::currentThread();
- qDebug() << "manager's thread: " << manager->thread();
- manager->get(QNetworkRequest(QUrl([url]http://www.baidu.com[/url])));
- QEventLoop loop;
- loop.exec();
- }
- private:
- QNetworkAccessManager * manager;
- };
- #endif // MYOBJECT_H
main.cpp:
- #include <QtCore/QCoreApplication>
- #include <myobject.h>
- #include <QThread>
- #include <QDebug>
- #include <QMetaObject>
- int main(int argc, char *argv[])
- {
- QCoreApplication a(argc, argv);
- qDebug() << "main thread: " << QThread::currentThread();
- MyObject object;
- QThread thread;
- object.moveToThread(&thread);
- thread.start();
- QMetaObject::invokeMethod(&object, "work", Qt::QueuedConnection);
- return a.exec();
- }
输出:
main thread: QThread(0xa02a28)
current thread: QThread(0x28fea8)
manager's thread: QThread(0x28fea8)
QObject::startTimer:
timers cannot be started from another thread
注意最后一行的QObject::startTimer:
timers cannot be started from another thread
这一行是在
网络访问结束并返回时,发生的warning。意思是说定时器在另一个线程中发起,而这个是Qt不允许的。
另一个线程是哪个线程呢?可能是主线程,也可能是QNetworkAccessManager内部实现异步的线程。但我觉得是前者
如果是后者,那在主线程中使用QNetworkAccessManager也会出现同样的
问题,但经验上没出现过这种问题。所以推断是前者