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

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

相关推荐
一然明月7 小时前
QT之基础控件
开发语言·qt
深蓝海拓12 小时前
PySide6从0开始学习的笔记(十) 样式表(QSS)
笔记·python·qt·学习·pyqt
深蓝海拓12 小时前
PySide6从0开始学习的笔记(十三) IDE的选择
笔记·python·qt·学习·pyqt
YouEmbedded13 小时前
解码QPixmap 图片自适应控件缩放与圆角处理
qt·图片适配控件
Y1rong13 小时前
QT之天气预报
qt
Larry_Yanan15 小时前
Qt多进程(二)QProcess+stdio
开发语言·qt
码农葫芦侠15 小时前
Qt 跨线程内存管理陷阱:QSharedPointer、deleteLater() 与 QPointer 的致命组合
开发语言·数据库·qt
CC.GG16 小时前
【Qt】信号和槽
开发语言·数据库·qt
水煎包V:YEDIYYDS88820 小时前
QT QML 实现的旋钮按钮,类似收音机音量旋钮,可指示方向和角度
qt·qml·旋钮组件
龚建波20 小时前
Qt程序设计:QPromise/QFuture多线程任务管理
qt·qfuturewatcher·qpromise·qfuture