Qt中线程之间共享的Pixmap

Pixmap shared between threads in Qt

本文关键字:Pixmap 共享 之间 线程 Qt      更新时间:2023-10-16

我有一个主GUI类和另一个Worker类:第一个处理GUI事务(将QPixmap绘制到QGraphicsScene中),第二个处理计算事务(在QPixmap上绘制QLine s和QPoint s)。这两个类在两个不同的线程中运行。当我创建Worker线程时,我将GUI的QPixmap的地址传递给Worker类,因此它们共享同一个对象。

QPixmapWorker类中进行修改,并在GUI类中绘制。即使我没有任何问题,我还是决定使用QMutex来确保我的程序在绘制QPixmap时不会试图访问它。现在,为了做到这一点,我在GUI类和Worker类之间共享了一个QMutexWorker类又有一个指向GUI的QMutex的指针)。每当我读取或修改QPixmap时,我都会锁定QMutex

这是一种有效的方法吗?到目前为止,我从未犯过错误,但我想知道它在逻辑上是否正确,以及Qt是否提供了更好的方法来实现这一点。

提前谢谢。

根据Qt5线程安全页面:

QPainter可以在线程中用于在QImage、QPrinter和Q图片绘制设备。在QPixmap和QWidget上绘制不是支持。

因此,官方的说法是否定的,您不应该在主线程之外修改QPixmap。你可能很"幸运",因为它恰好在你当前的用例下在你当前平台上工作,但Qt不能保证它会工作。

一种更安全的方法可能是让工作线程绘制到QImage对象中,然后当GUI线程想要更新GUI时,它可以获取并绘制最新版本的QImage对象(使用互斥或其他机制来确保工作线程不会同时更新QImage)。

我同意根据文档,不允许在工作线程中使用QPixmap。然而,根据代码。

构造函数检查它是否在主线程中。如果它不在主线程中,它会检查一个名为ThreaddPixmap的功能。如果启用,它将继续运行而不会出现问题。据我所见,ThreadedPixmap在所有平台上都受支持,因此似乎可以在其他线程上使用QPixmap。