12

私は自分のプロジェクトで Qt を使用して開発を行っており、よりスレッド指向の設計に移行し始めています。一部の GL レンダリング ウィジェットを他のスレッドに移動したところ、非常に奇妙な動作を発見しました。ユーザー入力を受け入れるウィジェット (QTextEdit など) がフォーカスを取得する前に、GL ウィジェットが別のスレッド (ブースト スレッドまたは QThread) から更新を開始すると、次のような XCB クラッシュが発生するようです。

[xcb] Too much data requested from _XRead
[xcb] This is most likely caused by a broken X extension library
[xcb] Aborting, sorry about that.
hypnotizer: ../../src/xcb_io.c:735: _XRead: Assertion ‘!xcb_xlib_too_much_data_requested’ failed.

これをテストするために、実際に GLHypnotizer デモに簡単な変更を加えてクラッシュを再現することができます。そのデモはここにあります: http://qt-project.org/doc/qt-4.8/demos-glhypnotizer.html [qt-project.org]

「mdiArea.addSubWindow(new QTextEdit(this));」という行を追加すると、313 行目あたり (newThread() の呼び出し前) で、デモが開始されると、QTextEdit と GL Hypnotizer ウィジェットが表示されます。QTextEdit をクリックしてフォーカスを取得すると、毎回上記のクラッシュが発生します。

上記の手順を使用して、Linux インストールでエラーを再現できる人はいますか? Qt とスレッド化を使用して、Linux でこの種の問題に遭遇した人はいますか?

注: Ubuntu 12 を使用していますが、このクラッシュは VirtualBox および VirtualBox 以外の Ubuntu インストールで発生します。

4

1 に答える 1

2

OpenGL、Qt レンダリング、およびマルチスレッドはうまく組み合わせられません。特に、OpenGL コンテキストは、一度に 1 つのスレッドでのみアクティブにできます。コンテキストが複数のウィジェット間で共有されている場合(これはコンテキスト間でオブジェクトを共有することとは異なることに注意してください。複数のウィンドウ/ウィジェットに使用される単一のコンテキストについて話しているのは正当です)、それらのウィジェットは異なるスレッドからレンダリングされます。多くの問題に巻き込まれる。

通常、OpenGL とマルチスレッドに関しては、それを行わないのが最善の方法です。はい、複数のスレッドを使用しますが、OpenGL やあらゆる種類のグラフィックス出力に関連しないすべてのスレッドに使用してください。重大な問題を回避するために、すべてのグラフィック操作を単一のスレッドに保持します。

于 2012-10-16T16:33:45.120 に答える