Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. Why QThread still working, when work is done?

Why QThread still working, when work is done?

Scheduled Pinned Locked Moved Unsolved General and Desktop
15 Posts 5 Posters 1.2k Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • Q Offline
    Q Offline
    qwe3
    wrote on last edited by qwe3
    #6

    @JonB Using processEvents() doesn't make sense in my code. I tried something different and accidentally add this method. And now I would like to know, what's going on.

    Can you explain me what means It's probably hanging in that when the main UI thread has gone away/is no longer running the UI loop.?

    I know there is an event loop, which is in the main.cpp file:

    return a.exec();
    

    So when I close app and my code is in mainWindow's destructor I can't receive signals, because mainWindow is no longer in a.exec()?

    EDIT:

    I don't see link between processEvents() and It's probably hanging in that when the main UI thread has gone away/is no longer running the UI loop.

    1 Reply Last reply
    0
    • Christian EhrlicherC Offline
      Christian EhrlicherC Offline
      Christian Ehrlicher
      Lifetime Qt Champion
      wrote on last edited by Christian Ehrlicher
      #7

      This works fine for me:

      class Worker : public QObject
      {
      public:
        void calculate()
        {
          QThread::sleep(20);
          QCoreApplication::processEvents();
        }
      };
      
      class MainWindow : public QMainWindow
      {
        Q_OBJECT
      public:
        MainWindow()
        {
          thread = new QThread(this);
          worker = new Worker;
          worker->moveToThread(thread);
          thread->start();
          QTimer::singleShot(0, worker, &Worker::calculate);
        }
        ~MainWindow()
        {
          thread->quit();
          thread->wait();
        }
      private:
        QThread *thread;
        Worker *worker;
      };
      
      int main(int argc, char **argv)
      {
        QApplication app(argc, argv);
        MainWindow mw;
        mw.show();
        return app.exec();
      }
      #include "main.moc"
      

      Please provide a minimal compilable example.

      Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
      Visit the Qt Academy at https://academy.qt.io/catalog

      1 Reply Last reply
      0
      • Q Offline
        Q Offline
        qwe3
        wrote on last edited by qwe3
        #8

        @Christian-Ehrlicher Your code is ok?

        I think I can't add parent to

        worker = new Worker(this);
        

        I have error:

        QObject::moveToThread: Cannot move objects with a parent
        

        EDIT:
        When I delete parent I get the same situation: I wait on thread->wait()

        EDIT2:
        My code:

        int main(int argc, char *argv[])
        {
            QApplication a(argc, argv);
            MainWindow w;
            w.show();
            return a.exec();
        }
        
        MainWindow::MainWindow(QWidget *parent)
            : QMainWindow(parent)
            , ui(new Ui::MainWindow)
        {
            ui->setupUi(this);
        
            thread = new QThread(this);
            worker = new Worker;
            worker->moveToThread(thread);
            thread->start();
            QTimer::singleShot(0, worker, &Worker::calculate);
        }
        
        MainWindow::~MainWindow()
        {
            thread->quit();
        
            qInfo()<<"BEFORE WAIT";
            thread->wait();
            qInfo()<<"AFTER WAIT";
        
            delete ui;
        }
        
        void Worker::calculate()
        {
            QThread::sleep(20);
            qInfo()<<"AFTER SLEEP";
            QCoreApplication::processEvents();
        }
        
        Christian EhrlicherC 1 Reply Last reply
        0
        • Q qwe3

          @Christian-Ehrlicher Your code is ok?

          I think I can't add parent to

          worker = new Worker(this);
          

          I have error:

          QObject::moveToThread: Cannot move objects with a parent
          

          EDIT:
          When I delete parent I get the same situation: I wait on thread->wait()

          EDIT2:
          My code:

          int main(int argc, char *argv[])
          {
              QApplication a(argc, argv);
              MainWindow w;
              w.show();
              return a.exec();
          }
          
          MainWindow::MainWindow(QWidget *parent)
              : QMainWindow(parent)
              , ui(new Ui::MainWindow)
          {
              ui->setupUi(this);
          
              thread = new QThread(this);
              worker = new Worker;
              worker->moveToThread(thread);
              thread->start();
              QTimer::singleShot(0, worker, &Worker::calculate);
          }
          
          MainWindow::~MainWindow()
          {
              thread->quit();
          
              qInfo()<<"BEFORE WAIT";
              thread->wait();
              qInfo()<<"AFTER WAIT";
          
              delete ui;
          }
          
          void Worker::calculate()
          {
              QThread::sleep(20);
              qInfo()<<"AFTER SLEEP";
              QCoreApplication::processEvents();
          }
          
          Christian EhrlicherC Offline
          Christian EhrlicherC Offline
          Christian Ehrlicher
          Lifetime Qt Champion
          wrote on last edited by Christian Ehrlicher
          #9

          @qwe3 said in Why QThread still working, when work is done?:

          @Christian-Ehrlicher Your code is ok?

          You're right, it was a slightly outdated version. Adjusted my code but still works fine.
          Your code is not compilable at all so I can't test yours. Please provide a minimal compilable example similar to mine without any ui file or other unneeded stuff.

          Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
          Visit the Qt Academy at https://academy.qt.io/catalog

          1 Reply Last reply
          0
          • Q Offline
            Q Offline
            qwe3
            wrote on last edited by
            #10
            This post is deleted!
            1 Reply Last reply
            0
            • Q Offline
              Q Offline
              qwe3
              wrote on last edited by qwe3
              #11

              @Christian-Ehrlicher

              Code:

              #include <QApplication>
              #include <QThread>
              #include <QTimer>
              #include <QMainWindow>
              #include <QDebug>
              class Worker : public QObject
              {
              public:
                void calculate()
                {
                  qInfo()<<"START SECOND THREAD";
                  QThread::sleep(20);
                  QCoreApplication::processEvents();
                  qInfo()<<"END SECOND THREAD";
                }
              };
              
              class MainWindow : public QMainWindow
              {
                Q_OBJECT
              public:
                MainWindow()
                {
                  thread = new QThread(this);
                  worker = new Worker;
                  worker->moveToThread(thread);
                  thread->start();
                  QTimer::singleShot(0, worker, &Worker::calculate);
                }
                ~MainWindow()
                {
                  thread->quit();
                  qInfo()<<"before";
                  thread->wait();
                  qInfo()<<"after";
                }
              private:
                QThread *thread;
                Worker *worker;
              };
              
              int main(int argc, char **argv)
              {
                QApplication app(argc, argv);
                MainWindow mw;
                mw.show();
                return app.exec();
              }
              #include "main.moc"
              

              I only add libraries and debuq. So I start app and after 5 second I close app using X button. Now I wait additional 15 seconds and see on debug END SECOND THREAD. And my app is still running. I have to close it in Qt Creator clicking red square. And have information:

              21:03:25: The program has unexpectedly finished.
              

              I don't see on debug after

              1 Reply Last reply
              0
              • Christian EhrlicherC Offline
                Christian EhrlicherC Offline
                Christian Ehrlicher
                Lifetime Qt Champion
                wrote on last edited by
                #12

                Works fine for me with Qt5.15 on linux but have the same effect on windows. Maybe it's worth opening a Qt bug report.

                Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
                Visit the Qt Academy at https://academy.qt.io/catalog

                1 Reply Last reply
                2
                • Q Offline
                  Q Offline
                  qwe3
                  wrote on last edited by
                  #13

                  @Christian-Ehrlicher Thank you for help, but I don't understand this:

                  but have the same effect on windows
                  

                  Which option:

                  1. On linux everything is ok, but on windows you have the same problem like me
                  2. On linux and windows everything is ok

                  ?

                  jsulmJ 1 Reply Last reply
                  0
                  • Q qwe3

                    @Christian-Ehrlicher Thank you for help, but I don't understand this:

                    but have the same effect on windows
                    

                    Which option:

                    1. On linux everything is ok, but on windows you have the same problem like me
                    2. On linux and windows everything is ok

                    ?

                    jsulmJ Offline
                    jsulmJ Offline
                    jsulm
                    Lifetime Qt Champion
                    wrote on last edited by
                    #14

                    @qwe3 Since @Christian-Ehrlicher suggested to open a bug report it works on Linux but not on Windows (in case 2 there would not be any need to file a bug report).

                    https://forum.qt.io/topic/113070/qt-code-of-conduct

                    1 Reply Last reply
                    0
                    • Q Offline
                      Q Offline
                      qwe3
                      wrote on last edited by
                      #15

                      @jsulm I think the same, but I wanted to make sure :)

                      1 Reply Last reply
                      0

                      • Login

                      • Login or register to search.
                      • First post
                        Last post
                      0
                      • Categories
                      • Recent
                      • Tags
                      • Popular
                      • Users
                      • Groups
                      • Search
                      • Get Qt Extensions
                      • Unsolved