起因

在做一个编译器词法分析的图形展示时用到了多线程,继承了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()。

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

  1. 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 ...

  2. 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 ...

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

    一篇又臭又长的流水账,要看结论可以直接拉到最后. 在一个项目中,需要使用串口接收外部的对射管状态,然后调用传感器.由于在之前的项目中,自制了一个带有UI的串口管理类(继承QDialog)最早在主线程中 ...

  4. Qt中子线程创建运行时候出现QObject: Cannot create children for a parent that is in a different thread

    这个主要是由于在子线程中创建了父线程的类 比如所我在这里创建指针时候传入了this指针,那么主线程运行run函数时候,相当于传入了主线程的this指针,那么这样就在在子线程创建了主线程的对象,所以就会 ...

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

    先声明,这个是QT5,不需要QThread:run或者exec之类的.写一个子类,然后实例化对象,直接move到新线程,然后线程start即可,子类也无需写while(1)这样的结构. 很多时候大家遇 ...

  6. 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 串口在主线程中 ...

  7. 重点:怎样正确的使用QThread类(注:包括推荐使用QThread线程的新方法QObject::moveToThread)...

    背景描述: 以前,继承 QThread 重新实现 run() 函数是使用 QThread唯一推荐的使用方法.这是相当直观和易于使用的.但是在工作线程中使用槽机制和Qt事件循环时,一些用户使用错了.Qt ...

  8. Qt知识点、疑难杂症的治疗

    Q: QVariant 保存指针数据 A1: 1,使用QVariant::fromValue((void*)target)保存数据 2,使用(ShortcutItem*)(v.value<voi ...

  9. 在多个线程中使用QNetworkAccessManager

    最近发现Tangram发出了URL request, 但是却收不到URL reponse 经研究后发现这是一个线程问题: Tangram会在多个线程发送URL request, 但是在实现时, 却没有 ...

最新文章

  1. mysql 索引 死锁,由不同的索引更新解决MySQL死锁套路
  2. vrrp preempt mode configed in keepalived conf
  3. 数据结构 互换二叉树中所有结点的左右子树 C
  4. Java自带的广告怎么删掉_如何屏蔽电脑上的弹窗广告?
  5. 使用log4Net 输出日志到mongodb
  6. 推荐几个NLP出论文的好方向!!
  7. linux tar进行归档压缩和解压
  8. 本文实例讲解了PHP使用MySQL事物锁的实例,并备有注释加以详细说明
  9. Prometheus+Grafana可视化监控SpringBoot项目
  10. python环境配置教程
  11. 中国电信路由器设置虚拟服务器,中国电信天翼宽带无线路由器设置方法
  12. 阿里云iconfont使用方法
  13. 分享10套好看的简历模板 | 免费Word模板下载
  14. android pc投屏,安卓投屏助手pc版
  15. 2018年阿里巴巴重要开源项目汇总
  16. 深入分析AIL语言及init.rc文件
  17. cf#94-div1-A. Statues
  18. EfficientFormer | 苹果手机实时推理的Transformer模型,登顶轻量化Backbone之巅
  19. 龙芯3A5000搭建idea开发环境
  20. 复杂网络分析 03 ER网络学习笔记

热门文章

  1. FANUC机器人进行负载设定和负载推算的具体方法
  2. 【C语言程序设计】求自然底数e,求自然对数的底e!
  3. 如何向gitee开源项目提交代码
  4. win7计算机无法启动,Win7 64位系统电脑无法开机进不了系统的解决方法【图】
  5. Fedora 12下安装Google Chrome和RealPlayer 11
  6. app的版本升级测试
  7. 关于计算机房弱电工程的书籍,弱电工程计算机机房设计规范..doc
  8. 从TOP25榜单,看半导体之变
  9. 爱奇艺 2021秋招在线笔试
  10. 破译肢体语言密码——王邈著