-
Bug
-
Resolution: Unresolved
-
P3: Somewhat important
-
None
-
5.13.0 Beta3
-
None
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);
}