gpt4 book ai didi

multithreading - QGLWidget 在另一个线程中?文档指的是什么?

转载 作者:行者123 更新时间:2023-12-04 06:40:12 25 4
gpt4 key购买 nike

我正在上传大量纹理(每秒 60 个 VGA 图像)并且它阻塞了我的 UI 线程。来自 the Qt 5.1 QGLWidget manual page (强调我的):

Texture uploading in a thread. Doing texture uploads in a thread may be very useful for applications handling large amounts of images that needs to be displayed, like for instance a photo gallery application. This is supported in Qt through the existing bindTexture() API. A simple way of doing this is to create two sharing QGLWidgets. One is made current in the main GUI thread, while the other is made current in the texture upload thread. The widget in the uploading thread is never shown, it is only used for sharing textures with the main thread. For each texture that is bound via bindTexture(), notify the main thread so that it can start using the texture.



什么?如何将基于 QWidget 的类(例如 QGLWidget)移动到线程中?尝试这样做会导致:
QObject::moveToThread: Widgets cannot be moved to a new thread

我不明白文档建议我为了移动而实现什么,例如 bindTexture()在 UI 线程外执行。

这里也提到了这一点: Qt4/Opengl bindTexture in separated thread

不过那里没有发布代码。

最佳答案

答案有点晚,但是小部件需要由创建它们的线程移动到新线程。在你的情况下是这样的:

QGLWidget *glWidget=new QGLWidget();
QThread *newThread=new QThread();

glWidget->doneCurrent();
glWidget->context()->moveToThread(newThread);

这里我只将 openGL 上下文移动到新线程,这需要捕获并忽略 QGLWidget 中的一些覆盖。您需要从 QGLWidget 创建一个新的派生类并覆盖以下内容。
virtual void glInit();
virtual void glDraw();

virtual void initializeGL();
virtual void resizeGL(int width, int height);
virtual void paintGL();

这会阻止标准 UI 线程尝试使 OpenGL 上下文在 UI 线程中处于当前状态。一旦你覆盖了上面的内容,你将需要一个事件系统来通知线程一些事件已经发生,主要是 resizeGl 和paintGL 否则小部件将无法与周围的其他人正确 react 。

最后一部分是创建 QGLWidget。构造中的参数之一是 const QGLWidget * shareWidget:
QGLWidget ( QWidget * parent = 0, const QGLWidget * shareWidget = 0, Qt::WindowFlags f = 0 )
QGLWidget ( QGLContext * context, QWidget * parent = 0, const QGLWidget * shareWidget = 0, Qt::WindowFlags f = 0 )
QGLWidget ( const QGLFormat & format, QWidget * parent = 0, const QGLWidget * shareWidget = 0, Qt::WindowFlags f = 0 )

然后,您将创建 ui QGLWidget 和线程 GLWidget(从 QGLWidget 派生出上述所有覆盖),确保在创建线程 GLWidget 时您将 QGLWidget 作为共享小部件提供。这将使 2 个 opengl 上下文共享,并允许您加载一个双方都可以看到的纹理。代码应如下所示:
QGLWidget *glWidget=new QGLWidget();
GLWidget *threadedWidget=new GLWidget(0/*parent*/, glWidget);
QThread *newThread=new QThread();

threadedWidget->moveToThread(newThread);

至于代码,我最近使用线程 QGLWidgets 编写了一个小示例程序,主要用于 openGL/openCL 互操作,但它显示在共享单个上下文的绘图线程中使用多个 QGLWidgets。代码在 github和描述在这里 http://www.krazer.com/?p=109

关于multithreading - QGLWidget 在另一个线程中?文档指的是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18345356/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com