我在 Windows 7 Ultimate 下使用 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:无法为位于不同线程中的父级创建子级。
(父级是QNetworkAccessManager(0x22fe58),父级线程是QThread(0x9284190),当前线程是ResultThread(0x22fe48)
这是什么意思?怎么解决呢?
The run()成员函数是在不同的线程中执行的,而不是所在线程QNetworkRequestManager
对象已创建。
这种不同线程的问题一直在发生Qt当你使用多线程时。解决这个问题的规范方法是使用signals and slots.
创建一个slot在对象中QNetworkRequestManager
属于,创建一个signal in 结果线程并连接两个地方,构造函数结果线程将是一个好地方。
当前所在的代码结果线程::run()去新的slot,并被替换为emit(yourSignal())
。如果需要,发送一个指针到您的结果线程作为发射函数的参数来访问成员函数/变量。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)