Qt的线程问题在Linux中(Qt Threading Issues in Linux)

2019-09-24 05:05发布

我一直在使用Qt现在开发了一段时间我的项目,我们开始转向更加面向线程设计。 在移动一些GL渲染小工具,其他线程我已经发现了一些很怪异的行为。 看来,如果一个GL窗口小部件开始从另一个线程的控件之前(升压螺纹或QThread的)接受用户输入(如一个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.

为了验证这一点,我其实可以做一个简单的修改到GLHypnotizer演示,重现崩溃。 该演示可以在这里找到: http://qt-project.org/doc/qt-4.8/demos-glhypnotizer.html [qt-project.org]

如果我添加行“mdiArea.addSubWindow(新的QTextEdit(本));” 在大约313线(调用newThread()之前),然后演示开始时会有一个QTextEdit和GL Hypnotizer的Widget。 如果我再点击的QTextEdit抢焦点我每次都会得到上面的崩溃。

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

注:我使用Ubuntu 12这种崩溃发生在VirtualBox和非VirtualBox的Ubuntu的安装

Answer 1:

OpenGL的,Qt的渲染和多线程不拌匀。 特别是OpenGL上下文可以一次在只有一个线程是活动的。 现在,如果上下文多个小部件之间共享(注意,从上下文之间共享这个对象不同,我说 - 这就是用于多个窗口/小工具是合法的单上下文)和这些部件由不同的线程你要去渲染进入一个很大的问题。

通常最好的行动当然,当谈到OpenGL和多线程的,不这样做。 使用多线程,是的,但使用它们,这不是与OpenGL或任何类型的图形输出的一切。 保留所有的图形操作一个单独的线程,以避免重大的问题。



文章来源: Qt Threading Issues in Linux