Потоковый OpenGL с общей проблемой QGLWidgets с Qt 5.1

Я использую два QGLWidgets. Один для загрузки текстур и один для рендеринга, но он не работает.

Я использовал следующее объяснение изhttp://blog.qt.digia.com/blog/2011/06/03/threaded-opengl-in-4-8/

Поток загрузки текстур Загрузка многих (или больших) текстур обычно является дорогостоящей операцией из-за объема данных, передаваемых в графический процессор. Опять же, это одна из тех операций, которая может излишне блокировать ваш основной поток. В 4.8 вы можете решить эту проблему, создав пару общих QGLWidgets. Один из виджетов обновляется в отдельном потоке, но никогда не отображается на экране. Основной поток информирует поток загрузки о том, какие изображения загружать, и поток загрузки просто вызывает bindTexture () для каждого из этих изображений, а затем уведомляет основной поток о завершении каждого из них, чтобы его можно было отобразить на экране.

С Qt 4.8 с MinGW он работает нормально, но теперь я использую Qt 5.1 с MSVC. Я получаю сообщение об ошибке, когда хочу сделать виджет в потоке текущим:

Невозможно сделать QOpenGLContext текущим в другом потоке

Я понимаю ошибку, но как я могу это исправить. Когда я не устанавливаю текущий виджет, я не могу загрузить текстуры (зависает в функции 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 в поток, он работает, но затем я получаю ошибку makeCurrent от API, когда будет построен графический интерфейс (трассировка стека, указанная в функции QLineEdit :: setPlaceHolderText в QT5Widgetsd). Когда я перемещаю myTextureWidget в поток через несколько секунд после того, как было показано главное окно, все работает нормально. Но как я могу узнать, когда qt завершил сборку GUI? Я рисую графический интерфейс для QGraphicsView с окном просмотра QGLWidget.

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

Ответы на вопрос(2)

Ваш ответ на вопрос