Cannot create children for a parent that is in a different thread Qt线程问题

起因

在做一个编译器词法分析的图形展示时用到了多线程,继承了QThread并重写了run方法。
基本上就是下面这个意思:

class Thread : public QThread {
void run() {
QObject *obj = new QObject(this);//这里出现了问题
}
};

运行时提示Cannot create children for a parent that is in a different thread


原因

经查阅,由于Qt要求一个QObject的孩子必须与它们的双亲驻足在同一个线程中。这意味着:
1. 不能使用QObject::moveToThread()作用于有双亲的对象;
2. 你千万不要在一个线程中创建对象的同时把QThread对象自己作为它的双亲。
第二条也就是我上面的错误,因为run()是在一个新的线程中运行的,而QThread本身是在他自身的双亲线程中。也就是这样导致了QObjectQThread的孩子却不在同一个线程中。


关于事件循环

那现在让我们拓展上面的例子

class Thread : public QThread {
void run() {
QObject *obj = new QObject();
connect(obj,&QObject::somesignal,this,&Thread:someslots);
}
};

加了一个connect函数,这样有时没有什么问题呢?会不会达成我们期待的效果呢?
在Qt4.4之前这是不行的。因为run内没有开启事件循环。里面的任何信号事件无法得到处理,所以我们需要在run里面调用QThread::exec()。这样一个QThread的局部事件循环就开启了。
然而在Qt4.4之后,QThread::run() 方法不再是一个纯虚函数,它调用了QThread::exec()。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值