QObject:不能为不同的线程中的父项创build子项
我在Windows 7旗舰版下使用了Qt Creator 1.3.0和Qt 4.6.0(32位)。 考虑以下QThread:
头
class ResultThread : public QThread { Q_OBJECT QString _post_data; QNetworkAccessManager _net_acc_mgr; signals: void onFinished(QNetworkReply* net_reply); private slots: void onReplyFinished(QNetworkReply* net_reply); public: ResultThread(); void run(); void setPostData(const QString& post_data); };
履行
ResultThread::ResultThread() : _net_acc_mgr(this) { connect(&_net_acc_mgr, SIGNAL(finished(QNetworkReply*)), this, SLOT(onReplyFinished(QNetworkReply*))); } void ResultThread::onReplyFinished(QNetworkReply* net_reply) { emit onFinished(net_reply); } void ResultThread::setPostData(const QString& post_data) { _post_data = post_data; } void ResultThread::run() { _net_acc_mgr.post(QNetworkRequest(QUrl("http://[omitted]")), QByteArray(_post_data.toStdString().c_str())); }
每当在ResultThread::run()
执行ResultThread::run()
,我在Qt Creator中得到以下应用程序输出:
QObject:不能为不同的线程中的父项创build子项。
(父母是QNetworkAccessManager(0x22fe58),父母的线程是QThread(0x9284190),当前线程是ResultThread(0x22fe48)
这是什么意思? 如何解决? 提前致谢。
run()成员函数在不同的线程中执行,而不是QNetworkRequestManager
对象创build的线程。
当你使用multithreading时,这种不同的线程问题总是与Qt一起发生。 解决这个问题的标准方法是使用信号和插槽 。
在QNetworkRequestManager
所属的对象中创build一个槽 ,在ResultThread中创build一个信号并连接这两个地方, ResultThread的构造函数将是一个不错的地方。
当前在ResultThread :: run()中的代码将进入新的插槽 ,并由emit(yourSignal())
代替。 如果需要,可以使用emit函数发送指向ResultThread的指针作为参数,以访问成员函数/variables。