【QT】Qt模块中的线程支持

Qt 模块中的线程支持

SQL 模块中的线程

连接只能在创建它的线程中使用。不支持在不同线程之间移动连接或者在不同线程中创建查询。

此外,QSqlDrivers 使用的第三方库可能对在多线程程序中使用 SQL 模块施加进一步限制。请查阅您的数据库客户端手册以获取更多信息。

线程中的绘图

QPainter 可以在线程中用于绘制到 QImage、QPrinter 和 QPicture 绘图设备上。不支持在 QPixmaps 和 QWidgets 上绘制。在 macOS 上,如果从非 GUI 线程打印,则不会显示自动进度对话框。

任意数量的线程可以同时绘制,但是一次只能有一个线程在给定的绘图设备上绘制。换句话说,如果每个线程都在不同的 QImage 上绘制,则两个线程可以同时绘制,但两个线程不能同时在同一 QImage 上绘制。

富文本处理中的线程

QTextDocument、QTextCursor 和所有相关类都是可重入的。

请注意,在 GUI 线程中创建的 QTextDocument 实例可能包含 QPixmap 图像资源。使用 QTextDocument::clone() 创建文档的副本,并将副本传递到另一个线程进行进一步处理(如打印)。

SVG 模块中的线程

QtSvg 模块中的 QSvgGenerator 和 QSvgRenderer 类都是可重入的。

隐式共享类和线程

Qt 对许多值类使用了称为隐式共享的优化,特别是 QImage 和 QString。从 Qt 4 开始,隐式共享类可以安全地在线程之间复制,就像任何其他值类一样。它们是完全可重入的。隐式共享实际上是隐式的。

在许多人看来,隐式共享和多线程是不兼容的概念,这是因为引用计数通常是如何完成的。然而,Qt 使用原子引用计数来确保共享数据的完整性,避免引用计数的潜在破坏。

请注意,原子引用计数并不保证线程安全性。在线程之间共享隐式共享类的实例时应使用适当的锁定。这与所有可重入类,无论是否共享,都要求相同。但是,原子引用计数确保了在其自己的、本地隐式共享类实例上工作的线程的安全性。我们建议使用信号和槽在线程之间传递数据,因为这可以在不需要任何显式锁定的情况下完成。

总而言之,在 Qt 4 中,隐式共享类实际上是隐式共享的。即使在多线程应用程序中,您也可以安全地将它们用作普通的、非共享的、可重入的基于值的类。

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值