【问题标题】:Qt Threading Issues in LinuxLinux 中的 Qt 线程问题
【发布时间】:2012-10-06 19:29:42
【问题描述】:

我已经在我的项目中使用 Qt 开发了一段时间,并且我们开始转向更加面向线程的设计。在将一些 GL 渲染小部件移动到其他线程时,我发现了一些非常奇怪的行为。看来,如果 GL Widget 在接受用户输入(例如 QTextEdit)的小部件获得焦点之前开始从另一个线程(增强线程或 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 小部件.如果我然后单击 QTextEdit 来获取焦点,我每次都会遇到上述崩溃。

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

注意:我使用的是 Ubuntu 12,此崩溃发生在 VirtualBox 和非 VirtualBox Ubuntu 安装中

【问题讨论】:

  • 你有没有得到解决方案?

标签: linux multithreading qt opengl xcb


【解决方案1】:

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

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

【讨论】:

  • Qt 和多线程混合不好?还是 OpenGL 和多线程混合不好?
  • @Chris:哦,谢谢,这确实是一个无意的错字。 OpenGL 不能很好地处理多线程。但是 Qt 在渲染方面也存在多线程问题。因此,将 Qt 绘图函数、OpenGL 和多线程混合在一起,您会感到头疼。
  • 链接的 Qt 演示看起来像是官方演示,因此是“好代码”。更重要的是,kelano 说它在添加 QT textedit 小部件之前一直有效,我认为这与 OpenGL 无关。此外,这是一个 XCB 错误。
  • 正如我上面的用户所指出的,即使在 Qt 线程之外运行一个 openGL 线程也会崩溃,所以我不确定这是多线程问题的 OpenGL。
  • 只是补充一下,这里是官方的 Qt 博客文章,声称可以通过演示链接:blog.qt.digia.com/2011/06/03/threaded-opengl-in-4-8
猜你喜欢
  • 1970-01-01
  • 2021-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多