Qt线程在Linux中的问题

在我的项目中,我一直在用Qt开发一段时间,现在我们开始转向更线程化的devise。 在将一些GL渲染小部件移动到其他线程时,我发现了一些非常奇怪的行为。 看来,如果一个GL Widget从另一个线程(boost线程或QThread)开始更新,然后接受用户input(如QTextEdit)的部件抓住焦点,我会看到如下所示的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. 

为了testing这个,我实际上可以对GLHypnotizer演示进行简单的修改来重现崩溃。 该演示可以在这里find: http ://qt-project.org/doc/qt-4.8/demos-glhypnotizer.html [qt-project.org]

如果我添加行“mdiArea.addSubWindow(new QTextEdit(this));' (在调用newThread()之前),然后当演示开始时,将会有一个QTextEdit和一个GL Hypnotizer Widget。 如果我然后点击QTextEdit抓住焦点,我会每次都得到上面的崩溃。

任何人都可以重新使用上述说明在Linux上安装错误? 有没有人在Linux上使用Qt和线程之前遇到这些types的问题?

注意:我正在使用Ubuntu 12,这个崩溃发生在VirtualBox和非VirtualBox Ubuntu安装中

Solutions Collecting From Web of "Qt线程在Linux中的问题"

OpenGL,Qt渲染和多线程混合不好。 特别是OpenGL上下文一次只能在一个线程中处于活动状态。 现在,如果上下文在多个小部件之间共享(请注意,这与上下文之间的共享对象不同,我说的是用于多个窗口/小部件的单个上下文,这是合法的),并且这些小部件将从您要前往的不同线程进入很多问题。

通常,OpenGL和多线程最好的方法就是不做。 是的,使用多个线程,但是将它们用于与OpenGL或任何类型的图形输出无关的所有内容。 保持所有的图形操作到一个单一的线程,以避免重大问题。