QObject:无法为位于不同线程中的父级创建子级

Don*_*alo 47 c++ qt

我在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的指针作为参数,以获得对成员函数/变量的访问.

  • 欢迎来到多线程世界.实际上,创建ResultThread的线程总是与执行ResultThread :: run()的线程不同.想一想,任何其他方式都没有意义.QThread的全部目的是在不同的线程中运行某些东西.为此,您需要在某处设置新线程的数据,这发生在创建ResultThread的线程中.完成后,您就可以运行该线程 - 当然它在另一个线程中运行... (18认同)
  • 这可行,但对我来说看起来很奇怪。我在 `ResultThread` 中声明了 _net_acc_mgr 但 `ResultThread::run()` 在另一个线程中执行!为什么Qt要这样设计呢?特别是,为什么 `ResultThread::run()` 在另一个线程而不是 `ResultThread` 中运行? (2认同)
  • 然后,如果所有代码都移到插槽中,则插槽将在父线程中执行。为什么要创建子线程? (2认同)