Потоковый 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);