强制OpenGL渲染总是运行在相同的(Q)线程在Qt

Force OpenGL rendering to run always on same (Q)Thread in Qt

本文关键字:Qt 线程 强制 运行 OpenGL      更新时间:2023-10-16

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

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

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

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

我也无法确定某个QThread是否总是使用相同的底层本地线程。是这样吗?

这是一种方法。你创建一个线程,只要你需要,它就存在,你可以给它添加任务。您可以替换QThread或使用std::thread.