我已经在我的项目中使用Qt进行开发一段时间了,我们开始转向更注重线程的设计。在将一些GL渲染小部件移动到其他线程时,我发现了一些非常奇怪的行为。似乎如果一个GL小部件在一个接受用户输入(如QTextEdit)获取焦点之前开始从另一个线程(boost线程或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]如果我在313行左右(newThread()函数调用之前)添加行“mdiArea.addSubWindow(new QTextEdit(this));”,那么当演示开始时,将会有一个QTextEdit和一个GL Hypnotizer Widget。如果我然后点击QTextEdit以获取焦点,每次都会出现上述崩溃。
是否有人可以使用上述说明在他们的Linux安装中重现错误?在Linux使用Qt和线程时,有人遇到过这些类型的问题吗?
注意:我正在使用Ubuntu 12,在VirtualBox和非VirtualBox Ubuntu安装中发生此崩溃。