运行错误: QObject: 无法创建子线程, 因为父线程位于不同的线程?  到底是什么鬼?
(Parent is QThread(0x7ffe4a5a1280), parent's thread is QThread(0x557f9e497e50), current thread is QThread(0x7ffe4a5a1280)
父亲是QThread 0x7ffe4a5a1280, 父亲线程是QThread(0x557f9e497e50), 当前线程是QThread(0x7ffe4a5a1280) ?

字面翻译过来说得确实不太清楚, 还是要翻译成人话.

先看一个简单的例子.

$ cat main.cpp#include <QApplication>
#include <QDebug>
#include "threadtest.h"int main(int argc, char *argv[])
{QGuiApplication app(argc, argv);ThreadTest tt;tt.start();return app.exec();
}
hjj@hjj:~/test/test_thread$ cat threadtest.h
#ifndef THREADTEST_H
#define THREADTEST_H
#include <QThread>
#include <QDebug>class Class1 : public QObject
{
public:Class1(QObject* parent) : QObject(parent){}
};class ThreadTest : public QThread
{
public:ThreadTest(){qDebug() << "ThreadTest::ThreadTest, construct thread = " << QThread::currentThread();}void run() override{qDebug() << "run thread = " << QThread::currentThread();qDebug() << "construct thread " << this->thread();m_class = new Class1(this);}private:Class1* m_class = nullptr;
};#endif
运行:
./test_thread
ThreadTest::ThreadTest, construct thread =  QThread(0x56399a8aee50)
run thread =  QThread(0x7ffc9379d0f0)
construct thread  QThread(0x56399a8aee50)
QObject: Cannot create children for a parent that is in a different thread.
(Parent is QThread(0x7ffc9379d0f0), parent's thread is QThread(0x56399a8aee50), current thread is QThread(0x7ffc9379d0f0)

问题出在 new Class1(this) 上 翻译成人话:
1. 你当前的线程是run 线程, 其线程ID 为 QThread(0x7ffc9379d0f0)
2. 你传递给Class1的参数是(this),  this 属于ThreadTest 的构造线程的变量. ThreadTest 属于另一个线程,其ID 为QThread(0x56399a8aee50)
说白了,在一个线程中,构建一个对象时,不能传递其它线程的变量地址(常见是其构造线程对象地址)到QObject.
为啥会有这种限制, 估计是QObject 的限制. 估计它在处理一些消息分发时要简化架构,这个线程处理另一个线程的对象会出问题.

总结一下它出现的条件.
1. 你想给QObject 传递指针,
2. 传递的指针与指针所在的线程不是同一个线程.

如何消除这种错误: 其中方法1,2需要调整你的程序架构(优化). 3可能是简单办法.
1. 修改Class1, 不继承QObject.  但这可能不是你想要的.
2. 去掉this, 传NULL 指针. 相当于还是去掉了QObject, 可能不是你想要的.
3. 将 m_class = new Class1(this); 提到构造函数中. 传递的this变量是构造线程变量到QObject.
这可能是最好的办法. 经测试可行. 此时threadtest.h 如下图示.

#ifndef THREADTEST_H
#define THREADTEST_H
#include <QThread>
#include <QDebug>class Class1 : public QObject
{
public:Class1(QObject* parent) : QObject(parent){}
};class ThreadTest : public QThread
{
public:ThreadTest(){qDebug() << "ThreadTest::ThreadTest, construct thread = " << QThread::currentThread();m_class = new Class1(this);}void run() override{qDebug() << "run thread = " << QThread::currentThread();qDebug() << "construct thread " << this->thread();}private:Class1* m_class = nullptr;
};#endif 

运行错误: QObject: 无法创建子线程, 因为父线程位于不同的线程? 到底是什么鬼?相关推荐

  1. pthread_create函数阻塞了主线程_5个状态,Python 中线程的生命周期

    编 程 的 朝 圣 之 路 ---------------------------------------- 当程序中包含多个线程时,CPU 不是一直被特定的线程霸占,而是轮流执行各个线程. 那么,C ...

  2. Android创建子线程和回调主线程的几种方式

    一. 创建子线程//通过继承threadpublic class JNThread1 extends Thread {public JNThread1(String name){super(name) ...

  3. Handler之创建子线程Handler

    Handler之创建子线程Handler Android的消息机制实现步骤: ①创建当前线程的looper ②创建当前线程的handler ③调用当前线程looper的loop方法 要实现创建子线程H ...

  4. python创建多线程_Python 多线程,threading模块,创建子线程的两种方式示例

    本文实例讲述了Python 多线程,threading模块,创建子线程的两种方式.分享给大家供大家参考,具体如下: GIL(全局解释器锁)是C语言版本的Python解释器中专有的,GIL的存在让多线程 ...

  5. python多线程的使用(导入线程模块、创建子线程任务、启动子线程任务、获取当前执行的线程号)

    1. 导入线程模块 #导入线程模块 import threading 2. 线程类Thread参数说明 Thread([group [, target [, name [, args [, kwarg ...

  6. access子窗体的控件vba怎么写_第37讲:VBA代码中运行错误的处理方式

    大家好,本来在这一讲要接着我们的上一讲内容讲解二师兄的成长过程之九,但之九的内容是错误的处理,为了大家能更好的掌握之九二师兄的成才内容,我们临时加入一讲专门讲解VBA中错误处理,这一讲中我重点讲一下V ...

  7. java怎么创建子线程_Java创建子线程的两种方法

    摘要: 其实两种方法归结起来看还是一种,都是利用Thread的构造器进行创建,区别就是一种是无参的,一种是有参的. 一.继承Thread线程类: 通过继承Thread类,重写run方法,子类对象就可以 ...

  8. 【Java9】异常,finally,线程创建(卖票),线程同步(卖包子),线程练习

    文章目录 1.错误和异常区别:Arrays.toString(array) 2.编译和运行异常:SimpleDateFormat 3.处理异常:方法声明抛出 4.finally关键字:catch相当于 ...

  9. java线程三种方法,Java基础_线程的使用及创建线程的三种方法

    线程:线程是操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位.一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务. 进程:进 ...

最新文章

  1. Ubuntu登录后黑屏,或者桌面图标消失不见
  2. 计算机网络于20世纪60年代萌芽,计算机网络的发展经过哪几个阶段?
  3. 搭建hadoop开发环境--基于xp+cygwin
  4. 【转】刨根究底字符编码之十六——Windows记事本的诡异怪事:微软为什么跟联通有仇?
  5. 微信坐标转换百度坐标
  6. java web部分问题以及解决方案
  7. 用winformz时间格式不正确_煮八爪鱼,有人用冷水,有人用开水,大厨:都不对,教你正确做法...
  8. SPOJ DQUERY D-query--线段树解法
  9. Java: 将中文省市名转换为指定格式拼音
  10. python杨辉三角居中_python杨辉三角
  11. 十款真正的编程游戏软件
  12. matlab曲线拟合方法和函数拐点查找
  13. 51单片机驱动TM1638芯片+Proteus仿真
  14. xp我的计算机不在桌面怎么办,xp系统开机后不显示桌面怎么办|xp电脑开机不显示桌面解决方法...
  15. c语言教师工资管理系统源程序设计,C语言教师工资管理系统
  16. Postman安装流程
  17. 2022年前端自学全套路线总结(黑马版)
  18. Detecting Spacecraft Anomalies Using LSTMs and Nonparametric Dynamic Thresholding
  19. dsp版win10和普通版区别_图文详解win10各个版本之间有什么区别
  20. MySQL报错:Duplicate entry ‘xxx‘ for key ‘xxx‘

热门文章

  1. 我们面临的困境,往往不是“程序问题”
  2. ARM 学习知识点梳理
  3. asp.net中的runat=server 属性
  4. 简单三维图片产生工具
  5. 能否用全息图来治疗近视
  6. java里localtime,java 时间转换之LocalDate,LocalTime ,LocalDateTime
  7. JAVA通过Cipher实现加密与解密
  8. 寒冰王座 背包问题之完全背包
  9. 使用Brackets
  10. 实验二 编码器及其应用