QObject:无法为处于不同主题的父项创建子项 [英] QObject: Cannot create children for a parent that is in a different thread

查看:295
本文介绍了QObject:无法为处于不同主题的父项创建子项的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

编辑:

我试过做你在评论中告诉我的...:

I tried doing what you guys told me in comments ... :

        Citizen * c = new Citizen(this);

        QThread thread;
        c->moveToThread(&thread);

        connect(&thread, SIGNAL(started()), c, SLOT(ProcessActions()));
        thread.start();

这会产生更多错误:

QThread: Destroyed while thread is still running
ASSERT failure in QThread::setTerminationEnabled(): "Current thread was not started with QThread.", file c:\ndk_buildrepos\qt-desktop\src\corelib\thread\qthread_win.cpp, line 542
Invalid parameter passed to C runtime function.
Invalid parameter passed to C runtime function.
QObject::killTimers: timers cannot be stopped from another thread

这个错误...我已经在这里停留了2天,无法获得解决方案。

I am having problems with this error ... I'm stuck on this for 2 days already and can't get a solution.

标题: >

Header:

class Citizen : public QThread
{
Q_OBJECT    
    QNetworkAccessManager * manager;

private slots:
    void onReplyFinished(QNetworkReply* net_reply);

public:
    Citizen(QObject * parent);

    void run();
};

实施:

Citizen::Citizen(QObject * parent)
{
    manager = new QNetworkAccessManager;
    connect(_net_acc_mgr, SIGNAL(finished(QNetworkReply*)),
            this, SLOT(onReplyFinished(QNetworkReply*)));
}

void Citizen::onReplyFinished(QNetworkReply* net_reply)
{
    emit onFinished(net_reply);
}

void Citizen::run()
{
    manager->get(QNetworkRequest(QUrl("http://google.com"));

    QEventLoop eLoop;
    connect(manager, SIGNAL( finished( QNetworkReply * ) ), &eLoop, SLOT(quit()));
    eLoop.exec(QEventLoop::ExcludeUserInputEvents);

    qDebug() << "loaded google!";

    exec();
}

当manager-> get()被执行时,我得到以下错误:

When manager->get() gets executed, I get the following error:

QObject: Cannot create children for a parent that is in a different thread.
(Parent is QNetworkAccessManager(0xc996cf8), parent's thread is QThread(0xaba48d8), current thread is Citizen(0xca7ae08)

执行eLoop.exec()时:

When eLoop.exec() gets executed:

QObject::startTimer: timers cannot be started from another thread

我以以下方式启动此主题:

I start this thread in the following manner:

Citizen * c = new Citizen(this);
c->start();

为什么会发生这种情况?如何解决这个问题?

Why does this happen? How to solve this?

推荐答案

我会尽量回答你为什么看到 QThread:运行错误。

I will just try to answer why you are seeing QThread: Destroyed while thread is still running error.

如果您这样做

void mtMethod () {

 Citizen * c = new Citizen(this);
 QThread thread;
 c->moveToThread(&thread);

 connect(&thread, SIGNAL(started()), c, SLOT(ProcessActions()));
 thread.start();
}

退出函数时,线程对象将被销毁,已经开始还在运行! Qt警告你应该停止线程或在更大的范围内创建线程对象。 (即使它成为你的类的成员函数)。类似这样:

The thread object will be destroyed when you exit the function but the thread that has been started is still running !. Qt is warning you that you should either stop the thread or create the thread object in a bigger scope. (i.e make it a member function of your class). Something like this :

class myClass
{
virtual ~myClass ();
 QThread mythread;
};

myClass::~myClass
{
  mythread.stop ();
}

void myClass::mtMethod () {

     Citizen * c = new Citizen(this);
     c->moveToThread(&mythread);

     connect(&mythread, SIGNAL(started()), c, SLOT(ProcessActions()));
     mythread.start();
}

这篇关于QObject:无法为处于不同主题的父项创建子项的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆