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

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

相关推荐
无小道2 小时前
QT——QFIie和QFileInfo文件类
开发语言·qt·命令模式
薛定谔的猫喵喵3 小时前
基于PyQt5的视频答题竞赛系统设计与实现
开发语言·qt·音视频
薛定谔的猫喵喵4 小时前
基于C++ Qt的唐代诗歌查询系统设计与实现
c++·qt·sqlite
枫叶丹44 小时前
【Qt开发】Qt界面优化(一)-> Qt样式表(QSS) 背景介绍
开发语言·前端·qt·系统架构
明月醉窗台16 小时前
qt使用笔记六之 Qt Creator、Qt Widgets、Qt Quick 详细解析
开发语言·笔记·qt
R_.L19 小时前
【QT】常用控件(按钮类控件、显示类控件、输入类控件、多元素控件、容器类控件、布局管理器)
开发语言·qt
无小道21 小时前
Qt——常用控件
开发语言·qt
初次见面我叫泰隆1 天前
Qt——5、Qt系统相关
开发语言·qt·客户端开发
牵牛老人1 天前
【Qt 开发后台服务避坑指南:从库存管理系统开发出现的问题来看后台开发常见问题与解决方案】
开发语言·qt·系统架构
xmRao1 天前
Qt+FFmpeg 实现 PCM 音频转 AAC 编码
qt·ffmpeg·pcm