强制OpenGL渲染始终在Qt中的相同(Q)线程上运行

时间:2014-08-08 13:41:18

标签: c++ multithreading qt opengl

我创建了一个带有Qt GUI的应用程序来进行图像处理。对于计算的一部分,OpenGL用于渲染变换后的图像(离屏)。一切都很好。但是,当在GUI线程中单击按钮时,我完成了所有繁重的处理。由于计算需要几秒钟,因此GUI变得无响应。

幸运的是,Qt已经包含了一个线程库(QThreadQtConcurrent等)。现在我只使用QtConcurrent::run()QFutureWatcher<cv::Mat>与回调函数异步进行计算。问题是在计算过程中,OpenGL函数被多次调用,现在可以在不同的线程上运行,以便连续按下按钮。如果渲染是在一个不同的线程上完成的,那么初始化OpenGL,Op​​enGL就什么都不渲染(黑屏)。当然这取决于Qt的线程处理。

所以我的问题是:使用当前设置(Qt线程和OpenGL)是否有一个简单的解决方案,没有额外的库等,以强制渲染始终在同一个线程上运行。

我知道有一个方法QObject::moveToThread(),但在这种情况下我不确切知道如何使用它。 OpenGL的东西根本不包含任何与Qt相关的代码或函数。那么我怎么能解决这个问题呢?

我也无法弄清楚某个QThread是否总是使用相同的底层本机线程。是这种情况吗?

1 个答案:

答案 0 :(得分:2)

这是一个approach。您可以根据需要创建一个生存的线程,并为其添加作业。您可以替换QThread或使用std :: thread。