Pixmap在Qt中的线程之间共享

时间:2015-11-24 21:39:54

标签: c++ multithreading qt qpixmap qmutex

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

Worker类中修改了QPixmap,并在Worker类中进行了绘制。即使我没有遇到任何问题,我也决定使用GUI来确保我的程序在绘制时不会尝试访问QMutex。现在,为了做到这一点,我在GUI类和QPixmap类之间共享QMutex类(Worker类再次指向GUI Worker )。每当我阅读或修改QMutex时,我都会锁定QPixmap

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

提前谢谢。

2 个答案:

答案 0 :(得分:2)

根据Qt5 thread-safety page

  

QPainter可以在一个线程中用于绘制到QImage,QPrinter和   QPicture涂装设备。在QPixmaps和QWidgets上绘画不是   支撑。

所以官方行是不行的,你不应该修改主线程之外的QPixmap。您可能“变得幸运”,因为它恰好在您当前的用例下在您当前的平台上运行,但Qt​​并不保证它能够正常工作。

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

答案 1 :(得分:0)

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

构造函数检查它是否在主线程中。如果它不在主线程中,则会检查名为ThreadedPixmap的功能。如果启用,它将继续没有问题。据我所知,所有平台都支持ThreadedPixmap,所以似乎可以在其他线程上使用QPixmaps。