Qt中线程间共享的像素图
Pixmap shared between threads in Qt
我有一个主 GUI class 和另一个 Worker class:第一个处理 GUI 的事情(将 QPixmap
绘制成 QGraphicsScene
),其次是计算(在 QPixmap
上绘制 QLine
s 和 QPoint
s)。
两个 classes 运行 在两个不同的线程中。
当我创建 Worker
线程时,我将 GUI 的 QPixmap
的地址传递给 Worker
class,因此它们共享同一个对象。
QPixmap
在Worker
class修改,GUI
class绘制。即使没有任何问题,我还是决定使用 QMutex
来确保我的程序在绘制时不会尝试访问 QPixmap
。现在,为了做到这一点,我在 GUI class 和 Worker
class 之间共享了一个 QMutex
(Worker
class 再次有一个指针到 GUI 的 QMutex
)。每当我阅读或修改 QPixmap
时,我都会锁定 QMutex
.
这是一种有效的方法吗?到目前为止我从来没有出错,但我想知道它在逻辑上是否正确以及 Qt 是否提供了更好的方法来完成这个。
提前谢谢你。
QPainter can be used in a thread to paint onto QImage, QPrinter, and
QPicture paint devices. Painting onto QPixmaps and QWidgets is not
supported.
所以官方说法是不,你不应该在主线程之外修改QPixmap。您可能 "getting lucky" 因为它恰好在您当前的用例下在您当前的平台上工作,但 Qt 不保证它会工作。
一个更安全的方法可能是让你的工作线程绘制到 QImage 对象中,然后当 GUI 线程想要更新 GUI 时,它可以获取并绘制最新版本的 QImage 对象(使用互斥锁或一些其他机制来确保工作线程不会同时更新 QImage)。
根据文档我同意,不允许在工作线程中使用 QPixmap。但是,根据代码。
构造函数检查它是否在主线程中。如果它不在主线程中,它会检查名为 ThreadedPixmap 的功能。如果启用,它将继续没有问题。据我所知,所有平台都支持 ThreadedPixmap,因此似乎可以在其他线程上使用 QPixmap。
我有一个主 GUI class 和另一个 Worker class:第一个处理 GUI 的事情(将 QPixmap
绘制成 QGraphicsScene
),其次是计算(在 QPixmap
上绘制 QLine
s 和 QPoint
s)。
两个 classes 运行 在两个不同的线程中。
当我创建 Worker
线程时,我将 GUI 的 QPixmap
的地址传递给 Worker
class,因此它们共享同一个对象。
QPixmap
在Worker
class修改,GUI
class绘制。即使没有任何问题,我还是决定使用 QMutex
来确保我的程序在绘制时不会尝试访问 QPixmap
。现在,为了做到这一点,我在 GUI class 和 Worker
class 之间共享了一个 QMutex
(Worker
class 再次有一个指针到 GUI 的 QMutex
)。每当我阅读或修改 QPixmap
时,我都会锁定 QMutex
.
这是一种有效的方法吗?到目前为止我从来没有出错,但我想知道它在逻辑上是否正确以及 Qt 是否提供了更好的方法来完成这个。
提前谢谢你。
QPainter can be used in a thread to paint onto QImage, QPrinter, and QPicture paint devices. Painting onto QPixmaps and QWidgets is not supported.
所以官方说法是不,你不应该在主线程之外修改QPixmap。您可能 "getting lucky" 因为它恰好在您当前的用例下在您当前的平台上工作,但 Qt 不保证它会工作。
一个更安全的方法可能是让你的工作线程绘制到 QImage 对象中,然后当 GUI 线程想要更新 GUI 时,它可以获取并绘制最新版本的 QImage 对象(使用互斥锁或一些其他机制来确保工作线程不会同时更新 QImage)。
根据文档我同意,不允许在工作线程中使用 QPixmap。但是,根据代码。
构造函数检查它是否在主线程中。如果它不在主线程中,它会检查名为 ThreadedPixmap 的功能。如果启用,它将继续没有问题。据我所知,所有平台都支持 ThreadedPixmap,因此似乎可以在其他线程上使用 QPixmap。