繁体   English   中英

Qt中线程之间共享的像素图

[英]Pixmap shared between threads in Qt

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

QPixmapWorker类中修改,在GUI类中绘制。 即使我没有任何问题,我还是决定使用QMutex来确保我的程序在绘制时不会尝试访问QPixmap 现在,为了做到这一点,我在 GUI 类和Worker类之间共享了一个QMutexWorker类再次有一个指向 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM