QObject: Cannot create children for a parent that is in a different thread

多线程中,每个线程都有自己的栈空间,在主线程(UI线程)中创建的对象,处于主线程的栈空间,在windows中出现提示QObject: Cannot create children for a parent that is in a different thread,在中标麒麟的系统中会出现段错误,崩溃。

错误例子:

class TestObject{

public:

          TestObject(){}

private:

         QUdpSocket m_sock;

}

void fun()

{

             TestObject* obj = new TestObject;

             QThread thread;

             obj->moveToThread(&thread);

             thread.start();

}

正确做法1:

class TestObject{

public:

          TestObject():m_sock(this) {}          //成员变量挨个指定this为父对象

private:

         QUdpSocket m_sock;

}

void fun()

{

             TestObject* obj = new TestObject;

             QThread thread;

             obj->moveToThread(&thread);

             thread.start();

}

 

 

正确做法2:

class TestObject{

public:

          TestObject(){}

          void moveToThread(QThread *thread)          //重写moveToThread,成员变量挨个move到新线程的栈空间

         {

                     m_sock.moveToThread(thread);

                     Object::moveToThread(thread);

           }

private:

         QUdpSocket m_sock;

}

void fun()

{

             TestObject* obj = new TestObject;

             QThread thread;

             obj->moveToThread(&thread);

             thread.start();

}

 

 

正确做法3:

class TestObject{

public:

          TestObject();

public slots:

         void initSlot();    //利用信号槽,在槽中创建对象

private:

         QUdpSocket* m_sock;

}

 

TestObject::TestObject()
{
    connect(this, &TestObject1::initSignal, this, &TestObject1::initSlot, Qt::QueuedConnection);
    emit initSignal();
}

void TestObject::initSlot()
{
    m_sock = new QUdpSocket;

}

void fun()

{

             TestObject* obj = new TestObject;

             QThread thread;

             obj->moveToThread(&thread);

             thread.start();

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值