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 中,隐式共享类实际上是隐式共享的。即使在多线程应用程序中,您也可以安全地将它们用作普通的、非共享的、可重入的基于值的类。