QImage with QThreads
QImage with QThreads
以下场景:我从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?
- Problems with std::cin.fail()
- 应用程序崩溃并显示"symbol _ZdlPvm, version Qt_5 not defined in file libQt5Core.so.5 with link time reference"
- 这对"With a stackless coroutine, only the top-level routine may be suspended."意味着什么
- Boost.TEST with CLion: "Test framework quit unexpectedly"
- 避免碎片化的ClientHellos with OpenSSL (DTLS)
- Issues with Win32 ReadProcessMemory API
- Qt with WinAPI MouseProc
- [[maybe_unused]] with structured_binding?
- Issue with WriteProcessMemory
- OpenCV RTP-Stream with FFMPEG
- "Unable to start debugging. No process is associated with this object." - 在Visual Studio Code中使用GDB
- std::adjacent_difference with std::chrono time_point
- DLL Made with CMake 使程序崩溃
- QtCreator with C 库中的链接器问题
- SHBrowseForFolder with BIF_BROWSEFORCOMPUTER and SHGetPathFr
- specialized std::default_delete with QQmlComponent
- VS2019 - Sudo Remote Debugging on Linux with Cmake project
- Inference pytorch C++ with alexnet and cv::imread image
- QImage with QThreads
- QVector with Qthreads