我在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);
};
Run Code Online (Sandbox Code Playgroud)
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()));
}
Run Code Online (Sandbox Code Playgroud)
每当_net_acc_mgr.post()
执行时ResultThread::run()
,我在Qt Creator中获得以下应用程序输出:
QObject:无法为位于不同线程中的父级创建子级.
(Parent是QNetworkAccessManager(0x22fe58),父线程是QThread(0x9284190),当前线程是ResultThread(0x22fe48)
这是什么意思?怎么解决?
Gun*_*iez 57
的运行()成员函数在不同的线程中执行,而不是其中的线程QNetworkRequestManager
被创建的对象.
当你使用多个线程时,Qt会一直发生这种不同的线程问题.解决此问题的规范方法是使用信号和插槽.
在属于的对象中创建一个槽,在ResultThread中QNetworkRequestManager
创建一个信号并连接两个地方,ResultThread的构造函数将是一个好地方.
当前在ResultThread :: run()中的代码转到新插槽,并替换为a emit(yourSignal())
.如有必要,使用您的emit函数发送一个指向ResultThread的指针作为参数,以获得对成员函数/变量的访问.
归档时间: |
|
查看次数: |
61054 次 |
最近记录: |