我在Windows 7旗舰版下使用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()));
}
每当在_net_acc_mgr.post()
中执行ResultThread::run()
时,我在Qt Creator中获得了以下应用程序输出:
QObject:无法为位于不同线程中的父级创建子级。
(Parent是QNetworkAccessManager(0x22fe58),父线程是QThread(0x9284190),当前线程是ResultThread(0x22fe48)
这是什么意思?怎么解决?
答案 0 :(得分:55)
run()成员函数在不同的线程中执行,而不是在创建QNetworkRequestManager
对象的线程中执行。
当您使用多个线程时, Qt 会一直发生这种不同的线程问题。解决此问题的规范方法是使用信号和插槽。
在QNetworkRequestManager
所属的对象中创建广告位,在 ResultThread 中创建信号并连接两个地方, ResultThread 的构造函数将是个好地方。
当前位于 ResultThread :: run()的代码将转到新的广告位,并被emit(yourSignal())
替换。如果需要,使用您的emit函数发送指向 ResultThread 的指针作为参数,以获取对成员函数/变量的访问权。