Details
-
Bug
-
Resolution: Unresolved
-
P3: Somewhat important
-
None
-
5.13.0 Beta3
-
None
Description
There are a couple errors in the hellowindow OpenGL example, but the main one being a threading issue. HelloWindow is created in the main thread, but whenever an event is received, Renderer::render() (belongs to a rendering thread) is called from the main thread.
diff --git a/examples/opengl/hellowindow/hellowindow.cpp b/examples/opengl/hellowindow/hellowindow.cpp index 1c1259de13..34eead20d3 100644 --- a/examples/opengl/hellowindow/hellowindow.cpp +++ b/examples/opengl/hellowindow/hellowindow.cpp @@ -95,13 +95,13 @@ void HelloWindow::exposeEvent(QExposeEvent *) { m_renderer->setAnimating(this, isExposed()); if (isExposed()) - m_renderer->render(); + QMetaObject::invokeMethod(m_renderer.get(), &Renderer::render, Qt::QueuedConnection); } bool HelloWindow::event(QEvent *ev) { if (ev->type() == QEvent::UpdateRequest) { - m_renderer->render(); + QMetaObject::invokeMethod(m_renderer.get(), &Renderer::render, Qt::QueuedConnection); requestUpdate(); } return QWindow::event(ev); diff --git a/examples/opengl/hellowindow/main.cpp b/examples/opengl/hellowindow/main.cpp index 7f0be39f5d..f655f07ad6 100644 --- a/examples/opengl/hellowindow/main.cpp +++ b/examples/opengl/hellowindow/main.cpp @@ -50,8 +50,6 @@ #include "hellowindow.h" -#include <qpa/qplatformintegration.h> - #include <QCommandLineParser> #include <QCommandLineOption> #include <QGuiApplication> @@ -108,20 +106,21 @@ int main(int argc, char *argv[]) QList<QThread *> renderThreads; if (multipleWindows) { QSharedPointer<Renderer> rendererB(new Renderer(format, rendererA.data())); + QSharedPointer<Renderer> rendererC(new Renderer(format, rendererA.data())); QThread *renderThread = new QThread; rendererB->moveToThread(renderThread); renderThreads << renderThread; - HelloWindow *windowB = new HelloWindow(rendererA); + HelloWindow *windowB = new HelloWindow(rendererB); windowB->setGeometry(QRect(center, windowSize).translated(delta / 2, 0)); - windowB->setTitle(QStringLiteral("Thread A - Context A")); + windowB->setTitle(QStringLiteral("Thread B - Context B")); windowB->setVisible(true); windows.prepend(windowB); - HelloWindow *windowC = new HelloWindow(rendererB); + HelloWindow *windowC = new HelloWindow(rendererC); windowC->setGeometry(QRect(center, windowSize).translated(-windowSize.width() / 2, windowSize.height() + delta)); - windowC->setTitle(QStringLiteral("Thread B - Context B")); + windowC->setTitle(QStringLiteral("Thread C - Context C")); windowC->setVisible(true); windows.prepend(windowC); }