Qt模块中的线程支持

线程和SQL模块

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

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

线程中的绘画

QPainter可以用在 threads 中用于在 QImageQPrinterQPicture、以及(对于大多数平台)QPixmap 绘图设备上绘画。不支持在 QWidgets上绘画。在macOS下,如果您从GUI线程以外的线程中打印,则不会显示自动进度对话框。

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

线程和富文本处理

QTextDocumentQTextCursor 以及所有相关类都是可重入的。

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

线程和SVG模块

QtSvg 模块中的 QSvgGeneratorQSvgRenderer 类是可重入的。

线程和隐式共享类

Qt为其许多值类使用了一个称为 隐式共享 的优化,特别是 QImageQString。从 Qt 4 开始,隐式共享类可以像任何其他值类一样安全地跨线程复制。它们是完全 可重入的。隐式共享实际上是真正 隐式的

在许多人心中,隐式共享和多线程是不兼容的概念,因为通常的引用计数方式。然而,Qt使用原子引用计数以确保共享数据的一致性,避免引用计数的潜在损坏。

请注意,原子引用计数并不能保证线程安全。当在多线程之间共享隐式共享类的实例时,应该使用适当的锁定机制。这对所有可重入类都有同样的要求,无论是否共享。然而,原子引用计数确实保证了在一个线程单独工作其本地实例时的安全。我们建议使用信号和槽在多个线程间传递数据,因为这样可以不需要任何显式的锁定。

总结一下,Qt 4中的隐式共享类确实是隐式共享的。即使在多线程应用程序中,您也可以像使用普通的、非共享、可重入的基于值的类一样安全地使用它们。

© 2024 The Qt Company Ltd. 本文档中包含的贡献的文档版权属于各自的拥有者。所提供的文档是根据自由软件基金会发布的GNU自由文档许可版本1.3的条款许可的。Qt及其相关标志是芬兰和/或世界上其他国家的The Qt Company Ltd.的商标。所有其他商标均为其各自所有者的财产。