QImage with QThreads

QImage with QThreads

本文关键字:QThreads with QImage      更新时间:2023-10-16

以下场景:我从OpenCV获得了一个多视频流,并通过QQuickImageProvider的实现显示在QML GUI中。如果图像发生变化,就会发出一个信号,这会导致GUI中的图像调用providers requestImage(…)函数。我对QImage的底层实现不太了解,尤其是如果我将其中一个图像从requestImage(…)传递到我的GUI会发生什么,但QImage的共享内存原理表明,当我的OpenCV线程在读取/传递图像到GUI时更新图像时,可能会出现问题。这是正确的吗?

我现在计划做的方法是向在图像更新和请求过程中被锁定的提供程序添加一个QMutex,并在请求函数中将请求的图像复制到一个新的QImage中,并在其上调用"bits()"函数,这显然会导致深度复制,然后解锁互斥。这样说有道理吗?有必要吗?

感谢

阅读Qt文档中隐式共享如何与线程一起工作。基本上,隐式共享是由原子计数器强制执行的,但您仍然需要提供线程安全性。

我现在计划做的方法是向提供者添加一个QMutex在图像更新和请求期间以及在请求中被锁定函数将请求的图像复制到新的QImage并调用"bits()"函数,这显然会导致深度复制,然后解锁互斥锁。这样说有道理吗?是吗必需的

医生说这是有道理的,这就是应该做的,只是没有必要对QImage进行深入复制。基本上,这对getter来说应该足够了。

QImage getImage() 
{
  m_mutex.lock();
  QImage img(m_image);
  m_mutex.unlock();
  return img;
}

您可能可以使用QMutexLocker来获得更高级的版本。

QImage是具有隐式共享(写时复制)的类之一。因此,不需要手动复制带有锁定的QImage;只需调用它的复制构造函数就可以了。复制很浅,但当你的线程试图更新它时,它会自动进行深度复制。

此外,你为什么不通过信号本身的QImage?