使用QGLWidget进行OpenGL上下文和线程错误

时间:2016-04-22 14:28:11

标签: multithreading qt opengl

我正在使用QGLWidget从Qt 4.8到Qt 5.5进行迁移。

我的错误是“无法使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();

我仍然得到同样的错误......

我对它应该如何工作有点困惑,有人可以帮助我吗?

问候,

1 个答案:

答案 0 :(得分:2)

错误是两件事的结合:

  1. Qt 5中的QGLContext是围绕QOpenGLContext的小包装器;
  2. QOpenGLContext是一个QObject(因此,它有QObject semantics when it comes to threading),并且由于某种原因,它还使用致命检查,禁止您从与线程不同的线程调用makeCurrent与("亲和力"这里是QObject概念)具有亲和力。
  3. 如果您控制两个线程,最好的办法可能就是创建一个新的QGLContext,与您的QGLWidget上下文共享;然后移动并使用这个新的上下文到线程中。你仍然需要你已经拥有的锁定 - 你不能在同一个表面上制作两个上下文。

    更一般地说,这被认为是QOpenGLContext的限制。我已经为Qt 5.8准备了一个试图摆脱它的补丁,你可以找到它here