Uploaded image for project: 'Qt'
  1. Qt
  2. QTBUG-75852

The hellowindow OpenGL example asserts with the --multiple option

    XMLWordPrintable

Details

    • Bug
    • Resolution: Unresolved
    • P3: Somewhat important
    • None
    • 5.13.0 Beta3
    • None
    • Linux/Wayland, Linux/X11

    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);
           }
      

      Attachments

        No reviews matched the request. Check your Options in the drop-down menu of this sections header.

        Activity

          People

            docteam Qt Documentation Team
            siyuan.navico Simon Yuan
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

            Dates

              Created:
              Updated:

              Gerrit Reviews

                There are no open Gerrit changes