Qt:qt对象的线程相关性

参考文档

深入了解QT消息循环及线程相关性
QT事件循环与线程

一、线程相关性

当我们创建一个QObject时,它会与创建自己所在的线程绑定。它参与的事件循环,其实是它所在线程的事件循环,如上图所示。假如某个线程没有默认的QThread::exec(),那么该线程上的QObject则无法接收到事件。

QThreadData

所有的QObject中都有QThreadData的成员;

我创建一个QObject对象,它的threadData,将和parent一致。若parent没有threadData,或者是没有parent,将调用QThreadData::current获取一个新的、当前线程的QThreadData,并且将当前线程设置为一个QAdoptedThread的实例

所有的相同线程的QObject,共享一份threadData,QThreadData内部有一个事件接收和分配器,即eventDispatcher。一个线程内所有的对象都使用者一个来进行事件分发

二、转移Object的事件循环执行线程 : moveToThread

更改对象及其子对象的线程相关性。如果对象有父对象,则无法移动该对象。事件处理将在targetThread中继续。

要将对象移动到主线程,请使用QApplication::instance()来检索指向当前应用程序的指针,然后使用QAApplication::thread()来获取应用程序所在的线程。例如:

myObject->moveToThread(QApplication::instance()->thread());

如果targetThread为nullptr,则此对象及其子对象的所有事件处理都将停止,因为它们不再与任何线程关联。

请注意,该对象的所有活动计时器都将重置。计时器首先在当前线程中停止,然后在targetThread中重新启动(间隔相同)。因此,在线程之间不断移动对象可以无限期地推迟计时器事件。

QEvent::ThreadChange事件在线程相关性更改之前发送到此对象。您可以处理此事件以执行任何特殊处理。请注意,发布到该对象的任何新事件都将在targetThread中处理,前提是它不是null:当它是nullptr时,不会对该对象或其子对象进行任何事件处理,因为它们不再与任何线程关联。

警告:此函数不是线程安全的;当前线程必须与当前线程相关性相同。换句话说,此函数只能将对象从当前线程"推"到另一个线程,而不能将对象从任何任意线程"拉"到当前线程。然而,这个规则有一个例外:没有线程相关性的对象可以被"拉"到当前线程

相关推荐
韭菜钟3 小时前
在Qt中用cmake实现类似pri文件的功能
开发语言·qt·系统架构
韭菜钟8 小时前
Qt从qmake迁移到cmake的记录
开发语言·qt
永不停转16 小时前
详谈 QLayout::SizeConstraint 和 QSizePolicy 对 QWidget 尺寸的影响
c++·qt
王廷胡_白嫖帝20 小时前
Qt网络速度测试工具开发教程 - 从零开始构建网络测速应用
开发语言·网络·qt
qq_25929724731 天前
QT-窗口类部件
c++·qt
楚Y6同学1 天前
QT之QSS的使用方法和常用控件的样式设置
开发语言·qt
Zafir20242 天前
Qt实现TabWidget通过addTab函数添加的页,页内控件自适应窗口大小
开发语言·c++·qt·ui
王廷胡_白嫖帝2 天前
Qt文件压缩工具项目开发教程
java·开发语言·qt
牵牛老人3 天前
Qt 插件开发全解析:从接口定义,插件封装,插件调用到插件间的通信
开发语言·qt
机器视觉知识推荐、就业指导3 天前
面试问题详解五:Qt 信号与槽的动态管理
开发语言·qt