Pixmap在Qt中的线程之间共享

问题描述 投票:2回答:2

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

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

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

先感谢您。

c++ multithreading qt qpixmap qmutex
2个回答
2
投票

根据Qt5 thread-safety page

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

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

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


0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.