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

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

  • 10
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值