[英]Pixmap shared between threads in Qt
我有一个主要的 GUI 类和另一个 Worker 类:第一个处理 GUI 的事情(将QPixmap
绘制到QGraphicsScene
),第二个处理计算的事情(将QLine
和QPoint
绘制到QPixmap
)。 这两个类在两个不同的线程中运行。 当我创建Worker
线程时,我将 GUI 的QPixmap
的地址传递给Worker
类,因此它们共享相同的对象。
QPixmap
在Worker
类中修改,在GUI
类中绘制。 即使我没有任何问题,我还是决定使用QMutex
来确保我的程序在绘制时不会尝试访问QPixmap
。 现在,为了做到这一点,我在 GUI 类和Worker
类之间共享了一个QMutex
( Worker
类再次有一个指向 GUI 的QMutex
的指针)。 每当我阅读或修改QPixmap
我都会锁定QMutex
。
这是一种有效的方法吗? 到目前为止,我从未出错,但我想知道它在逻辑上是否正确,以及 Qt 是否提供了更好的方法来实现这一点。
先感谢您。
根据Qt5 线程安全页面:
QPainter 可以在线程中用于在 QImage、QPrinter 和 QPicture 绘制设备上进行绘制。 不支持在 QPixmaps 和 QWidgets 上绘画。
所以官方的说法是不,你不应该在主线程之外修改 QPixmap。 您可能“很幸运”,因为它恰好在您当前的用例下在您当前的平台上工作,但 Qt 不保证它会工作。
一种更安全的方法可能是让您的工作线程绘制到 QImage 对象中,然后当 GUI 线程想要更新 GUI 时,它可以抓取并绘制最新版本的 QImage 对象(使用互斥锁或其他一些机制来制作确保工作线程不会同时更新 QImage)。
我同意根据文档,不允许在工作线程中使用 QPixmap。 但是,根据代码。
构造函数检查它是否在主线程中。 如果它不在主线程中,它会检查名为 ThreadedPixmap 的功能。 如果启用,它将继续没有问题。 据我所知,所有平台都支持 ThreadedPixmap,因此似乎可以在其他线程上使用 QPixmap。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.