我创建了一个线程,该线程用于从图像加载纹理,而另一个线程用于通过paintGL()
在屏幕上绘制图像。但是抛出了异常。
我需要锁吗? 我担心使用锁可能会导致问题,因为这两个线程在做不同的事情但共享相同的资源。
如何以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
}