Qt模块中的线程支持
线程和SQL模块
连接只能在创建它的线程内使用。不支持在线程之间移动连接或从不同的线程创建查询。
此外,QSqlDrivers使用的第三方库可以对在多线程程序中使用SQL模块施加进一步的限制。有关更多信息,请参阅数据库客户端手册
线程绘画
QPainter可以在线程中用于绘制QImage、QPrinter和QPicture绘制设备。不支持绘制到QPixmaps和QWidgets上。在macOS上,如果你从GUI线程之外打印,自动进程对话框将不会显示。
任意数量的线程可以在任何给定的时间进行绘制,但是在一个给定的绘制设备上只有一个线程一次可以进行绘制。换句话说,如果每个线程都绘制到单独的QImages上,那么两个线程可以同时绘制,但是两个线程不能同时绘制到相同的QImage上。
线程和富文本处理
QTextDocument,QTextCursor和所有相关的类都是可重入的。
请注意,在GUI线程中创建的QTextDocument实例可能包含QPixmap图像资源。 使用QTextDocument :: clone() 创建文档的副本,并将该副本传递给另一个线程以进行进一步处理(例如打印)。
线程和SVG模块
QtSvg模块中的QSvgGenerator和QSvgRenderer类是可重入的。
线程和隐式共享的类
Qt对它的许多值类使用了一种称为隐式共享的优化,尤其是QImage和QString。从Qt 4开始,隐式共享类可以像其他值类一样安全地在线程间复制。它们是完全可重入的。隐式共享实际上是隐式的。
在许多人看来,隐式共享和多线程是不兼容的概念,这是因为引用计数通常是这样做的。然而,Qt使用原子引用计数来确保共享数据的完整性,避免了引用计数器的潜在损坏。
注意,原子引用计数不能保证线程安全。当线程之间共享隐式共享类的实例时,应该使用适当的锁。这是对所有可重入类(共享或不共享)的相同要求。然而,原子引用计数确实保证了在隐式共享类的本地实例上工作的线程是安全的。我们建议使用信号和插槽在线程之间传递数据,因为这样做不需要任何显式锁定。
总的来说,Qt 4中的隐式共享类实际上是隐式共享的。即使在多线程应用程序中,您也可以安全地使用它们,就像它们是普通的、非共享的、可重入的基于值的类一样。