私は自分のプロジェクトで 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 インストールで発生します。