Qt中线程之间共享的Pixmap
Pixmap shared between threads in Qt
我有一个主GUI类和另一个Worker类:第一个处理GUI事务(将QPixmap
绘制到QGraphicsScene
中),第二个处理计算事务(在QPixmap
上绘制QLine
s和QPoint
s)。这两个类在两个不同的线程中运行。当我创建Worker
线程时,我将GUI的QPixmap
的地址传递给Worker
类,因此它们共享同一个对象。
QPixmap
在Worker
类中进行修改,并在GUI
类中绘制。即使我没有任何问题,我还是决定使用QMutex
来确保我的程序在绘制QPixmap
时不会试图访问它。现在,为了做到这一点,我在GUI类和Worker
类之间共享了一个QMutex
(Worker
类又有一个指向GUI的QMutex
的指针)。每当我读取或修改QPixmap
时,我都会锁定QMutex
。
这是一种有效的方法吗?到目前为止,我从未犯过错误,但我想知道它在逻辑上是否正确,以及Qt是否提供了更好的方法来实现这一点。
提前谢谢。
根据Qt5线程安全页面:
QPainter可以在线程中用于在QImage、QPrinter和Q图片绘制设备。在QPixmap和QWidget上绘制不是支持。
因此,官方的说法是否定的,您不应该在主线程之外修改QPixmap。你可能很"幸运",因为它恰好在你当前的用例下在你当前平台上工作,但Qt不能保证它会工作。
一种更安全的方法可能是让工作线程绘制到QImage对象中,然后当GUI线程想要更新GUI时,它可以获取并绘制最新版本的QImage对象(使用互斥或其他机制来确保工作线程不会同时更新QImage)。
我同意根据文档,不允许在工作线程中使用QPixmap。然而,根据代码。
构造函数检查它是否在主线程中。如果它不在主线程中,它会检查一个名为ThreaddPixmap的功能。如果启用,它将继续运行而不会出现问题。据我所见,ThreadedPixmap在所有平台上都受支持,因此似乎可以在其他线程上使用QPixmap。
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 在cuda线程之间共享大量常量数据
- 如何从具有移动语义的类对象中生成共享指针
- 在c代码之间共享数据的最佳方式
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 将静态库链接到不带-fPIC的共享库中
- 为什么std::互斥需要很长的、非常不规则的时间来共享
- 使用Boost Interprocess创建托管共享内存需要很长时间
- 无法在Ubuntu上将共享库与Eclipse链接
- 从python调用openMP共享库时,未定义opnMP函数
- 在为LINUX创建共享库时,如何避免STL的私有/弱副本
- 为什么我的共享库中存在展开符号
- 使用共享指针的函数调用,其对象应为 const
- 具有两个独占锁组的共享锁
- 共享队列的线程安全
- 共享指针和具有自定义删除程序的唯一指针之间的语法差异背后的任何原因
- 多个"常量引用"变量可以共享同一个内存吗?
- 如何访问由共享指针保存的类方法?
- Qt中线程之间共享的Pixmap