栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Qt-QThread与QObject使用需要注意的点

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Qt-QThread与QObject使用需要注意的点

QThread继承于QObject,代表一个线程,每个线程都有自己的事件循环。

初始线程通过QCoreApplication::exec()开启事件循环,单dialog应用通过QDialog::exec()开启,其他线程通过QThread::exec()开启

每个QObject对象都生存(live)于其被创建的线程中。查看QObject对象所在线程可调用thread()

QObject::moveToThread()可改变对象的线程亲和性(thread affinity)。如果有父对象则不能move。

在非QObject对象所属线程delete该对象是不安全的,除非能保证该对象没有正在处理事件(events),应使用deleteLater

如果事件循环没有在运行,事件将不会传递给对象。线程安全函数QCoreApplication::postEvent()可以在任意线程手动传递传递给任意对象事件。QCoreApplication::sendEvent()则只能给同线程的对象传递事件。

事件过滤器(Event filter)要求监控与被监控对象处于同一个线程中

QObject不是线程安全的,因此在非对象所属线程中调用该对象函数且对象可能在处理事件时,应该加锁,否则可能导致崩溃。

QObject类可重入,其大部分非UI子类也是**可重入(reentrant)**的,可重入(reentrant)意味着在不同线程中创建若干个QObject实例能同时各自调用。这些类被设计为在单一线程中使用,这意味着我们不能在A线程中创建对象而在B线程中调用其函数

有三条约束规则

    QObject对象的孩子必须在"其父对象所创建的线程中"创建事件驱动对象只能用于单线程QThread线程删除所有在线程内创建的对象

GUI类必须在主线程中使用

QObject必须在QApplication创建后使用,这意味着不存在static的QObject类

信号、槽、线程

连接类型

Auto Connection。如果信号是在接收对象所亲和的线程中发出的,则行为与直接连接相同。否则,行为与排队连接相同。”Direct Connection 。当信号发出时,槽会立即被调用。槽在发射信号的线程中执行。Queued Connection。当控制返回到接收者线程的事件循环时调用该槽,槽在接收者的线程中执行。Blocking Queued Connection。与Queued Connection相同,不同的地方在于会阻塞直到槽函数返回。同线程将导致死锁Unique Connection。与Auto Connection相同,不同的地方在于如果已经存在完全相同的连接,则不进行连接。

参考:

    https://doc.qt.io/qt-5/threads-qobject.html
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/759718.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号