gpt4 book ai didi

c++ - 线程化 OpenGL 与 Qt 5.1 共享 QGLWidgets 问题

转载 作者:可可西里 更新时间:2023-11-01 17:56:09 25 4
gpt4 key购买 nike

我使用两个 QGLWidgets。一个用于加载纹理,一个用于渲染,但它不起作用。

我使用了以下解释 http://blog.qt.digia.com/blog/2011/06/03/threaded-opengl-in-4-8/

Texture uploading thread Uploading many (or large) textures is typically an expensive operation because of the amount of data being pushed to the GPU. Again, this is one of those operations that can unnecessarily block your main thread. In 4.8 you can solve this problem by creating a pair of shared QGLWidgets. One of the widgets is made current in a separate thread, but is never made visible on screen. The main thread informs the uploading thread which images to upload and the uploading thread simply calls bindTexture() on each of these images and then notifies the main thread when each one has finished so it can be drawn to screen.

使用带有 MinGW 的 Qt 4.8,它工作正常,但现在我使用带有 MSVC 的 Qt 5.1。当我想让线程中的小部件成为当前线程时出现错误:

Cannot make QOpenGLContext current in a different thread

我明白这个错误,但我该如何修复它。当我不设置当前小部件时,我无法加载纹理(在 bindTexture() 函数处卡住)。我也想知道,为什么它适用于我的旧 QT 版本。当错误出现时,我可以按“忽略错误”,程序无论如何都会加载纹理。

下面是一些示例代码:

加载纹理:

GLContext::GLContext(QWidget *parent, QGLWidget *myDisplayWidget) :
QGLWidget(parent,myDisplayWidget)
{
}

...

GLContext* myTextureWidget = new GLContext(this,myDisplayWidget);

...

void TextureLoadingThread::run()
{
makeCurrent(); //Here is the bug!
QImage *im = new QImage(filename);
GLuint textid = myTextureWidget->bindTexture(*im, GL_TEXTURE_2D, GL_RGBA);
}

编辑:

当我将 myTextureWidget 的上下文移动到它工作的线程时,但是当 GUI 将构建时我从 API 得到 makeCurrent 错误(堆栈跟踪在 QT5Widgetsd 中的 QLineEdit::setPlaceHolderText 函数中表示)。当我在显示主窗口几秒钟后将 myTextureWidget 移动到线程时,一切正常。但是我怎么知道 qt 什么时候完成所有 GUI 构建的东西?我将 GUI 绘制到带有 QGLWidget 视口(viewport)的 QGraphicsView。

myTextureWidget->context()->moveToThread(myTextureLoadingThread);

最佳答案

在启动新线程并调用 makeCurrent() 之前,您必须启动 doneCurrent(),例如

void QGLWidget::startRendering()
{
doneCurrent();
context()->moveToThread(mTextureLoadingThread);
}

然后调用

void TextureLoadingThread::run()
{
makeCurrent(); //Here is the bug!
...
}

这就是我为解决此错误所做的工作。不幸的是,我没有使用线程进行渲染的完美解决方案。

//编辑

我已经上传了一个例子:https://dl.dropboxusercontent.com/u/165223/thread_example.zip

关于c++ - 线程化 OpenGL 与 Qt 5.1 共享 QGLWidgets 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19202338/

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