小编kel*_*ano的帖子

Qt线程问题在Linux中

我已经在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.
Run Code Online (Sandbox Code Playgroud)

为了测试这一点,我实际上可以对GLHypnotizer演示进行简单的修改以重现崩溃.该演示可以在这里找到:http://qt-project.org/doc/qt-4.8/demos-glhypnotizer.html [qt-project.org]

如果我添加行'mdiArea.addSubWindow(new QTextEdit(this));' 在第313行(在调用newThread()之前),然后当演示开始时,将有一个QTextEdit和一个GL Hypnotizer Widget.如果我然后点击QTextEdit来获取焦点,我每次都会遇到上述崩溃.

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

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

linux opengl qt multithreading xcb

11
推荐指数
1
解决办法
3242
查看次数

OpenSceneGraph 和多个查看器

我正在使用 OpenSceneGraph 和 Qt 开发模拟软件。模拟可以涉及同一虚拟世界中的多个机器人。我对视图的要求如下:

  • 能够显示静态世界相机
  • 能够显示机器人摄像头
  • 能够移动这些视图和/或堆叠它们

为了完成这些任务,我制作了一个“OSGWidget”,它使用 Osg 查看器在 QGLWidget 内渲染场景。该 OSGWidget 又被放入 QDockWidget 中,该 QDockWidget 可以移动和/或堆叠,从而满足该要求。

问题是,当使用多个单一查看器在不同的小部件中渲染同一场景时,我会得到奇怪的渲染行为。也就是说,纹理无法正确显示,有时甚至根本无法显示。

我浏览过 SO 和 OSG 论坛,虽然人们也遇到了类似的问题,但我看到的唯一回应是建议切换到 Osg CompositeViewer。出于我的目的,我想避免使用它,因为它破坏了我对渲染同一场景的可移动和可堆叠小部件的期望要求。

这是一个棘手的情况,Osg 不容易处理吗?我见过几篇帖子说这不是 OSG “应该工作的方式”,但他们并没有真正提供事实来支持这一说法。有没有人做过类似的事情或有任何想法/见解?如果需要,我可以提供代码片段,但由于这可能与 Osg 的意识形态相矛盾,我将等待得到一些答复。

opengl qt openscenegraph qglwidget

5
推荐指数
1
解决办法
2936
查看次数

在 Debian 软件包中支持多个 Boost 版本

我正在尝试为我的一个项目创建一个 debian 包,但遇到了 boost 版本支持的问题。

确实看这个问题。它很相似,但提供的解决方案(Build-Depends)并不真正适用于我,因为我正在制作二进制安装程序。

基本上,我安装的库和可执行文件总是链接到 libboost_(component).so.1.46 而不是符号链接库 libboost_(component).so。让我的 debian 安装程序只能由拥有我的确切 boost 版本的人使用。我正在使用 CPack 制作 debian 包,我的depends 行如下所示:

SET(CPACK_DEBIAN_PACKAGE_DEPENDS "libboost-dev (>= 1.46),
                                  libboost-thread-dev (>= 1.46),
                                  libboost-signals-dev (>= 1.46),
                                  libboost-system-dev (>= 1.46), 
                                  libboost-filesystem-dev (>= 1.46),
                                  libboost-python-dev (>= 1.46), ..." )
Run Code Online (Sandbox Code Playgroud)

我是否需要为所述平台上的每个平台或该平台的 boost 版本构建单独的安装程序?

installation debian boost cmake cpack

5
推荐指数
1
解决办法
1995
查看次数

C++ 数组初始化的 Doxygen 问题

我正在使用 Doxygen 为我当前的项目生成一个 API,并且发生了一些奇怪的行为。基本上,如果我使用初始化列表在类的构造函数中设置成员数组,Doxygen 不会产生正确的输出。

这是一个简单的测试类:

#ifndef TEST_HPP
#define TEST_HPP

class TestClass {
public:
    /** Constructor Version 1 */
    TestClass() : v{0,0,0} { }

    /** Constructor Version 2 */
    // TestClass() { 
    //     v[0] = 0;
    //     v[1] = 0;
    //     v[2] = 0;
    // }
protected:
    /** my little array */
    float[3] v;
};

#endif // TEST_HPP
Run Code Online (Sandbox Code Playgroud)

如果我使用构造函数的版本 1 在文件上运行 doxygen,我会得到一个相对空的类的 HTML 文件,没有构造函数文档,也没有提到我的变量 v。如果我注释掉版本 1 并使用版本 2,Doxygen 会正确生成类的文档。

我知道这种类型的数组设置对 C++11 来说是新的,但它是初始化还是它在初始化列表中完成的事实?如果有人知道导致这种行为的原因,我将不胜感激,因为我们在整个代码中使用这些类型的初始化程序,并且我希望在必要时避免进行彻底的更改。

c++ doxygen initialization-list

0
推荐指数
1
解决办法
1085
查看次数