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时,不会对该对象或其子对象进行任何事件处理,因为它们不再与任何线程关联。

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

相关推荐
小短腿的代码世界4 小时前
QtAV音视频播放实战深度解析:从零构建高性能跨平台播放器
qt·音视频
CSCN新手听安6 小时前
【Qt】Qt窗口(八)QFontDialog字体对话框,QInputDialog输入对话框的使用,小结
开发语言·c++·qt
charlie1145141919 小时前
AwesomeQt:最小的Qt6系列迷你版本教程发布!
linux·c++·qt·c
CSCN新手听安9 小时前
【Qt】系统相关(一)内容简介,事件概念,事件的处理
开发语言·c++·qt
比特 GOK11 小时前
Qt项目ui文件中新添加的控件在代码中不识别的问题解决
开发语言·qt·ui
繁星蓝雨11 小时前
Qt多界面创建的优化问题(main函数或主界面中创建?)—————附带详细方法
c++·qt·架构·多界面管理
Cx330❀12 小时前
Qt 入门指南:从零搭建开发环境到第一个图形界面程序
xml·大数据·开发语言·网络·c++·人工智能·qt
十五年专注C++开发13 小时前
Qt程序设计涉及到的开发软件
开发语言·c++·qt
IT策士14 小时前
Python mcp研究:入门到精通
开发语言·python·qt
姆路14 小时前
Qt尺寸策略
c++·qt