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
本身是在他自身的双亲线程中。也就是这样导致了QObject
是QThread
的孩子却不在同一个线程中。
关于事件循环
那现在让我们拓展上面的例子
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()。
Cannot create children for a parent that is in a different thread Qt线程问题相关推荐
- QObject: Cannot create children for a parent that is in a different thread错误
QObject: Cannot create children for a parent that is in a different thread错误 classTcpComm:publicQThr ...
- QT出现 Cannot create children for a parent that is in a different thread 的解决方法:
QT出现 Cannot create children for a parent that is in a different thread 的解决方法: 参考文章: (1)QT出现 Cannot c ...
- QObject: Cannot create children for a parent that is in a different thread
一篇又臭又长的流水账,要看结论可以直接拉到最后. 在一个项目中,需要使用串口接收外部的对射管状态,然后调用传感器.由于在之前的项目中,自制了一个带有UI的串口管理类(继承QDialog)最早在主线程中 ...
- Qt中子线程创建运行时候出现QObject: Cannot create children for a parent that is in a different thread
这个主要是由于在子线程中创建了父线程的类 比如所我在这里创建指针时候传入了this指针,那么主线程运行run函数时候,相当于传入了主线程的this指针,那么这样就在在子线程创建了主线程的对象,所以就会 ...
- QObject: Cannot create children for a parent that is in a different thread.
先声明,这个是QT5,不需要QThread:run或者exec之类的.写一个子类,然后实例化对象,直接move到新线程,然后线程start即可,子类也无需写while(1)这样的结构. 很多时候大家遇 ...
- Qt串口多线程:QObject: Cannot create children for a parent that is in a different thread.
详细使用请参考我的另一篇文章: https://tangxing.blog.csdn.net/article/details/111721947 1. 警告详情 2. 解决办法 2.1 串口在主线程中 ...
- 重点:怎样正确的使用QThread类(注:包括推荐使用QThread线程的新方法QObject::moveToThread)...
背景描述: 以前,继承 QThread 重新实现 run() 函数是使用 QThread唯一推荐的使用方法.这是相当直观和易于使用的.但是在工作线程中使用槽机制和Qt事件循环时,一些用户使用错了.Qt ...
- Qt知识点、疑难杂症的治疗
Q: QVariant 保存指针数据 A1: 1,使用QVariant::fromValue((void*)target)保存数据 2,使用(ShortcutItem*)(v.value<voi ...
- 在多个线程中使用QNetworkAccessManager
最近发现Tangram发出了URL request, 但是却收不到URL reponse 经研究后发现这是一个线程问题: Tangram会在多个线程发送URL request, 但是在实现时, 却没有 ...
最新文章
- mysql 索引 死锁,由不同的索引更新解决MySQL死锁套路
- vrrp preempt mode configed in keepalived conf
- 数据结构 互换二叉树中所有结点的左右子树 C
- Java自带的广告怎么删掉_如何屏蔽电脑上的弹窗广告?
- 使用log4Net 输出日志到mongodb
- 推荐几个NLP出论文的好方向!!
- linux tar进行归档压缩和解压
- 本文实例讲解了PHP使用MySQL事物锁的实例,并备有注释加以详细说明
- Prometheus+Grafana可视化监控SpringBoot项目
- python环境配置教程
- 中国电信路由器设置虚拟服务器,中国电信天翼宽带无线路由器设置方法
- 阿里云iconfont使用方法
- 分享10套好看的简历模板 | 免费Word模板下载
- android pc投屏,安卓投屏助手pc版
- 2018年阿里巴巴重要开源项目汇总
- 深入分析AIL语言及init.rc文件
- cf#94-div1-A. Statues
- EfficientFormer | 苹果手机实时推理的Transformer模型,登顶轻量化Backbone之巅
- 龙芯3A5000搭建idea开发环境
- 复杂网络分析 03 ER网络学习笔记