Qt-如何使一个线程用于加载纹理而另一线程用于运行paintGL()

时间:2019-04-23 03:07:06

标签: qt opengl

我创建了一个线程,该线程用于从图像加载纹理,而另一个线程用于通过paintGL()在屏幕上绘制图像。但是抛出了异常。

  1. 我需要锁吗? 我担心使用锁可能会导致问题,因为这两个线程在做不同的事情但共享相同的资源。

  2. 如何以QOpenGLWidget方式共享上下文?

https://stackblitz.com/edit/angular-oo3xas?file=src%2Fapp%2Fapp.component.ts

  

OpenGL使用的多线程模型建立在一个事实之上:   同一OpenGL上下文不能在多个线程中处于当前状态   同时。虽然可以有多个OpenGL上下文   当前在多个线程中,您无法操作单个上下文   从两个线程同时进行。

我在QOpenGLWidget::makeCurrent()中添加了initializeGL(),在QCoreApplication::setAttribute(Qt::AA_ShareOpenGLContexts)中添加了main(),但无法正常工作。这似乎比仅添加这些语句还要复杂。

MyOpenGLWidget.cpp

void MyOpenGLWidget::initializeGL()
{
    QMutexLocker LOCKER(&mutext);

    QOpenGLWidget::makeCurrent();
    QOpenGLFunctions::initializeOpenGLFunctions();
    // some other code here
}

void MyOpenGLWidget::loadTexture()
{
    if (eof == true)
        return;
    QMutexLocker LOCKER(&mutext);

    img_data = SOIL_load_image(path, &width, &height, &channels, SOIL_LOAD_RGB);
    glEnable(GL_TEXTURE_2D);
    glGenTextures(1, &texture); // Access violation reading location thrown
    // some other code here
}

void MyOpenGLWidget::paintGL()
{
    QMutexLocker LOCKER(&mutext);

    glActiveTexture(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_2D, texture);
    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
}

MyGLThread.cpp

void MyGLThread::init(MyOpenGLWidget* widget)
{
    gl_widget = widget;
}

void MyGLThread::loadTexture()
{
    gl_widget->loadTexture();
}

void MyGLThread::run()
{
    while (true) {

        if (!gl_widget)
            continue;
        // some other code
        loadTexture();
        msleep(30);
    }
}

MyMainWindow.cpp

MyMainWindow::MyMainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    ui.setupUi(this);
    gl = new MyOpenGLWidget(this);
    gl_thread = new MyGLThread();
    gl_thread->init(gl);
    gl_thread->start();
    // some other code
}

0 个答案:

没有答案