2016-04-22 21 views
1

私は、QGLWidgetを使用しているかなり大きいアプリケーションのQt 4.8からQt 5.5への移行に取り組んでいます。QGLWidgetでのOpenGLコンテキストとスレッドエラー

私のエラーは「別のスレッドで現在のQOpenGLContextを作成できません」です。

私がこのエラーについて理解したことは、エラーが言うように、OpenGLコンテキストは1つのスレッドにしかバインドできず、このスレッドだけがコンテキストを使用できます。これは、その「makeCurrent」への同時呼び出しを回避するために、いくつかのスレッドのロックで、Qtの4.8で働いていた

myQGLWidget->makeCurrent(); 

.. some openGL 

myQGLWidget->doneCurrent(); 

古いコードは次のようでした。私はまだ同じエラーを取得し

myQGLWidget->context()->moveToThread(QThread::currentThread()); 
myQGLWidget->context()->makeCurrent(); 
... openGL again 
myQGLWidget->context()->doneCurrent(); 

...

私はそれがになっています方法については少し困惑している:

被写体に何私ができるすべてを読んだ後、私の最後の試みをして仕事、誰かが私を助けることができますか?

よろしく、

答えて

1

エラーは2つの組み合わせについてです:Qtの5中

  1. QGLContextはQOpenGLContext周りの小さなラッパです。
  2. QOpenGLContextはQObjectです(したがって、QObject semantics when it comes to threading)。何らかの理由で、致命的なチェックを使用して、親和性を持つスレッドとは異なるスレッドからmakeCurrentを呼び出すことを禁じていますQObjectの概念です)。

もしあなたが両方のスレッドを制御しているなら、あなたのQGLWidgetのコンテキストと共有するだけで、新しいQGLContextを単純に作成することができます。この新しいコンテキストを移動してスレッドに使用します。あなたはまだあなたが既に持っているロックが必要です - あなたは同じ表面上に2つのコンテキストを最新にすることはできません。

一般に、これはQOpenGLContextの制限として認識されています。私はすでにQt 5.8のパッチを用意してそれを取り除こうとしています。それはhereです。

+0

申し訳ありませんが、私はまだ失われています。私はmakeCurrentフォームを別のスレッドで呼び出さないようにしても構いません。 [this Qt doc](http://doc.qt.io/qt-5/qglwidget.html)のセクション・スレッディングは、 'moveToThread'を使用しなければならないことを伝えています。これは動作しません(' thread ) '' moveToThread'の前後に同じ結果を与えます)。私の場合は、データを読み込むスレッドがあり、これもいくつかのOpenGL呼び出し(glGenBuffers)を行います。だから1つのウィジェット、1つのコンテキスト、2つのスレッド(申し訳ありませんが、私はこれを前に説明したかもしれません)。 – Krag

+1

申し訳ありませんが、コードの特定の行を誤って読みました: 'myQGLWidget-> context() - > moveToThread(QThread :: currentThread());'が間違っています。あなたはそれをすることはできません。コンテキストを新しいスレッドにプッシュするだけで、新しいスレッドからプルすることはできません。 – peppe

+0

ああ...ありがとう!それからあなたのQtパッチソリューションを使用します。 – Krag

関連する問題