我在我的项目中使用 Qt 进行开发已经有一段时间了,我们开始转向更加面向线程的设计。在将一些 GL 渲染小部件移动到其他线程后,我发现了一些非常奇怪的行为。看起来,如果 GL Widget 在接受用户输入的小部件(例如 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 http://qt-project.org/doc/qt-4.8/demos-glhypnotizer.html[qt-project.org]
如果我在第 313 行左右添加行‘mdiArea.addSubWindow(new QTextEdit(this));’(在调用 newThread() 之前),那么当演示启动时,将会出现一个 QTextEdit 和一个 GL Hypnotizer Widget。如果我然后单击 QTextEdit 来获取焦点,我每次都会遇到上述崩溃。
任何人都可以使用上述说明在 Linux 安装上重现该错误吗?以前有人在使用 Qt 和线程的 Linux 上遇到过这些类型的问题吗?
注意:我使用的是 Ubuntu 12,此崩溃发生在 VirtualBox 和非 VirtualBox Ubuntu 安装中
OpenGL、Qt 渲染和多线程不能很好地混合。特别是,OpenGL 上下文一次只能在一个线程中处于活动状态。现在,如果上下文在多个小部件之间共享(请注意,这与在上下文之间共享对象不同,我说的是用于多个窗口/小部件的单个上下文,这是合法的)并且这些小部件从您要使用的不同线程渲染陷入很多问题。
通常,当涉及到 OpenGL 和多线程时,最好的做法是不这样做。是的,使用多线程,但将它们用于与 OpenGL 或任何类型的图形输出无关的所有内容。将所有图形操作保持在单个线程中以避免出现重大问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)