OpenGL上下文和线程与QGLWidget错误
问题描述:
我正在从Qt 4.8迁移到Qt 5.5,使用QGLWidget的一个非常大的应用程序。OpenGL上下文和线程与QGLWidget错误
我的错误是“不能使QOpenGLContext在不同的线程中当前”。
我对这个错误的理解是,正如错误所说,openGL上下文只能绑定到一个线程,并且只有这个线程可以使用上下文。
旧代码是这样的:
myQGLWidget->makeCurrent();
.. some openGL
myQGLWidget->doneCurrent();
这是在Qt的4.8工作,与一些螺纹锁,以避免给“makeCurrent”并发调用。
阅读毕竟我关于这个问题,我的最后一次尝试是什么:
myQGLWidget->context()->moveToThread(QThread::currentThread());
myQGLWidget->context()->makeCurrent();
... openGL again
myQGLWidget->context()->doneCurrent();
我仍然得到同样的错误...
我有点困惑它应该如何工作,有人可以帮助我吗?
问候,
答
的误差约为两两件事的组合:
- QGLContext Qt中5是围绕QOpenGLContext小包装器;
- QOpenGLContext是一个QObject(因此它具有QObject semantics when it comes to threading),并且出于某种原因,它还使用了一个致命检查,该致命检查禁止您从与它具有相关性的线程不同的线程调用
makeCurrent
(“affinity”是QObject的概念)。
如果你在控制这两个线程,最好的做法可能是简单地创建一个新的QGLContext
,与你的QGLWidget的上下文共享;然后移动并使用这个新的上下文到线程中。您仍然需要已有的锁定 - 不能在同一表面上创建两个上下文。
更一般地说,这被认为是QOpenGLContext的限制。我已经为Qt 5.8准备了一个补丁来试图摆脱它,你可以找到它here。
对不起,但我仍然输了。我很好,以防止调用makeCurrent形式不同的线程。 [这个Qt文档](http://doc.qt.io/qt-5/qglwidget.html),节线程,告诉我,我必须使用'moveToThread',这是行不通的(调用'thread( )''moveToThread'前后给出相同的结果)。在我的情况下,我得到了一个线程加载数据,这也使一些openGL调用(glGenBuffers)。所以它是一个小部件,一个上下文,但是两个线程(对不起,我可能以前已经解释过)。 – Krag
对不起,我误解了一行代码:'myQGLWidget-> context() - > moveToThread(QThread :: currentThread());'是错误的。你不能那样做。您只能从拥有该上下文的线程推入新线程,而不能从新线程拉出。 – peppe
哦...非常感谢!然后我将使用你的Qt补丁解决方案。 – Krag