Linux下的Qt多线程问题

12

我已经在我的项目中使用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安装中发生此崩溃。

你是否曾经得到解决方案? - 246tNt
1个回答

2

OpenGL、Qt渲染和多线程不相容。特别是,只能有一个线程激活OpenGL上下文。如果上下文被共享给多个窗口小部件(注意这与在上下文之间共享对象不同,我谈论的是为多个窗口/小部件使用的单个上下文,这是合法的),并且这些小部件从不同的线程进行渲染,那么你将会遇到大量问题。

通常情况下,当涉及到OpenGL和多线程时,最好的做法是不要尝试。可以使用多个线程,但用于所有与OpenGL或任何类型的图形输出无关的操作。保持所有图形操作在单个线程中以避免主要问题。


1
Qt和多线程不搭吗?还是OpenGL和多线程不搭呢? - Chris
1
@Chris:哦,谢谢,那确实是一个无意的打字错误。OpenGL在处理多线程时表现不佳。但是当涉及渲染时,Qt也存在其自身的多线程问题。因此,混合使用Qt绘图函数、OpenGL和多线程会导致严重的头痛问题。 - datenwolf
Qt演示链接看起来像是官方演示,因此是“好代码”。更重要的是,Kelano说它可以工作,直到添加QT textedit小部件,我认为这与OpenGL无关。此外,这是一个XCB错误。 - Abe Schneider
@datenwolf:在我的应用程序中,有一个OpenGL专用的渲染线程。然而,在主Qt线程中,我有一个QTextEdit似乎会引起问题,我正在演示复制这个问题。我提到20个线程是针对Hypnotizer演示的,其中我可以运行20个GL线程,但一旦我触摸TextEdit,它就会崩溃。我想象演示中的GLThreads有一些安全机制,主线程没有使用(例如makeCurrent调用)。 - kelano
1
补充一下,这是官方Qt博客文章的链接,声称可以通过以下链接演示实现线程化OpenGL:http://blog.qt.digia.com/2011/06/03/threaded-opengl-in-4-8/ - Abe Schneider
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接