我创建了一个带有Qt GUI的应用程序来进行图像处理。对于计算的一部分,OpenGL用于渲染变换后的图像(离屏)。一切都很好。但是,当在GUI线程中单击按钮时,我完成了所有繁重的处理。由于计算需要几秒钟,因此GUI变得无响应。
幸运的是,Qt已经包含了一个线程库(QThread
,QtConcurrent
等)。现在我只使用QtConcurrent::run()
和QFutureWatcher<cv::Mat>
与回调函数异步进行计算。问题是在计算过程中,OpenGL函数被多次调用,现在可以在不同的线程上运行,以便连续按下按钮。如果渲染是在一个不同的线程上完成的,那么初始化OpenGL,OpenGL就什么都不渲染(黑屏)。当然这取决于Qt的线程处理。
所以我的问题是:使用当前设置(Qt线程和OpenGL)是否有一个简单的解决方案,没有额外的库等,以强制渲染始终在同一个线程上运行。
我知道有一个方法QObject::moveToThread()
,但在这种情况下我不确切知道如何使用它。 OpenGL的东西根本不包含任何与Qt相关的代码或函数。那么我怎么能解决这个问题呢?
我也无法弄清楚某个QThread
是否总是使用相同的底层本机线程。是这种情况吗?