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. How do QThread::start and Worker::doWork related?
Forum Updated to NodeBB v4.3 + New Features

How do QThread::start and Worker::doWork related?

Scheduled Pinned Locked Moved Solved General and Desktop
21 Posts 8 Posters 8.2k Views 3 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.
  • J.HilkJ J.Hilk

    @jronald if you want to start the doWork slot immediately after starting the thread, you can link those two together

       Controller() {
           Worker *worker = new Worker;
           worker->moveToThread(&workerThread);
           connect(&workerThread, &QThread::finished, worker, &QObject::deleteLater);
           connect(this, &Controller::operate, worker, &Worker::doWork);
           connect(worker, &Worker::resultReady, this, &Controller::handleResults);
    
           connect(&workerThread, &QThread::started, this, &Controller::operate); //<-- Added connection
    
           workerThread.start();
       }
    
    jronaldJ Offline
    jronaldJ Offline
    jronald
    wrote on last edited by
    #8

    @J.Hilk OK. It seems that even a running thread could be moved from thread to thread, is it true?

    VRoninV J.HilkJ 2 Replies Last reply
    0
    • jronaldJ jronald

      @J.Hilk OK. It seems that even a running thread could be moved from thread to thread, is it true?

      VRoninV Offline
      VRoninV Offline
      VRonin
      wrote on last edited by
      #9

      @jronald QThread is not the thread itself. it's a wrapper around it. I still don't see the point in moving a QThread object to another thread

      "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
      ~Napoleon Bonaparte

      On a crusade to banish setIndexWidget() from the holy land of Qt

      1 Reply Last reply
      3
      • jronaldJ jronald

        @J.Hilk OK. It seems that even a running thread could be moved from thread to thread, is it true?

        J.HilkJ Online
        J.HilkJ Online
        J.Hilk
        Moderators
        wrote on last edited by
        #10

        @jronald said in How do QThread::start and Worker::doWork related?:

        @J.Hilk OK. It seems that even a running thread could be moved from thread to thread, is it true?

        The QThread object itself just manages one thread. That said, it's not strictly necessary to move/asign your worker-object to the QThread-Object before it is started.

        But if you create for example a QTimer in your worker and move it than later to an other QThread, that won't work. Iirc the Timer releated things are ignored/not executed.

        That is also true if you create instances of classes that have internal time specific things.
        For example I run into this, when I had an QSerialPort object that was created in the constructor, had to move it the an initialization function that was called after the QThread started.


        Be aware of the Qt Code of Conduct, when posting : https://forum.qt.io/topic/113070/qt-code-of-conduct


        Q: What's that?
        A: It's blue light.
        Q: What does it do?
        A: It turns blue.

        kshegunovK jronaldJ 2 Replies Last reply
        0
        • J.HilkJ J.Hilk

          @jronald said in How do QThread::start and Worker::doWork related?:

          @J.Hilk OK. It seems that even a running thread could be moved from thread to thread, is it true?

          The QThread object itself just manages one thread. That said, it's not strictly necessary to move/asign your worker-object to the QThread-Object before it is started.

          But if you create for example a QTimer in your worker and move it than later to an other QThread, that won't work. Iirc the Timer releated things are ignored/not executed.

          That is also true if you create instances of classes that have internal time specific things.
          For example I run into this, when I had an QSerialPort object that was created in the constructor, had to move it the an initialization function that was called after the QThread started.

          kshegunovK Offline
          kshegunovK Offline
          kshegunov
          Moderators
          wrote on last edited by
          #11

          @J.Hilk said in How do QThread::start and Worker::doWork related?:

          But if you create for example a QTimer in your worker and move it than later to an other QThread, that won't work. Iirc the Timer releated things are ignored/not executed.

          The timer should be stopped before moving to another thread, you can't move an active timer.

          Read and abide by the Qt Code of Conduct

          1 Reply Last reply
          2
          • J.HilkJ J.Hilk

            @jronald said in How do QThread::start and Worker::doWork related?:

            @J.Hilk OK. It seems that even a running thread could be moved from thread to thread, is it true?

            The QThread object itself just manages one thread. That said, it's not strictly necessary to move/asign your worker-object to the QThread-Object before it is started.

            But if you create for example a QTimer in your worker and move it than later to an other QThread, that won't work. Iirc the Timer releated things are ignored/not executed.

            That is also true if you create instances of classes that have internal time specific things.
            For example I run into this, when I had an QSerialPort object that was created in the constructor, had to move it the an initialization function that was called after the QThread started.

            jronaldJ Offline
            jronaldJ Offline
            jronald
            wrote on last edited by
            #12

            @J.Hilk @VRonin @kshegunov
            Not clear, I think I'll try the native API. Thanks.

            VRoninV kshegunovK 2 Replies Last reply
            0
            • jronaldJ jronald

              @J.Hilk @VRonin @kshegunov
              Not clear, I think I'll try the native API. Thanks.

              VRoninV Offline
              VRoninV Offline
              VRonin
              wrote on last edited by
              #13

              @jronald said in How do QThread::start and Worker::doWork related?:

              Not clear

              Try taking a look at https://mayaposch.wordpress.com/2011/11/01/how-to-really-truly-use-qthreads-the-full-explanation/

              "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
              ~Napoleon Bonaparte

              On a crusade to banish setIndexWidget() from the holy land of Qt

              jronaldJ 1 Reply Last reply
              2
              • jronaldJ jronald

                @J.Hilk @VRonin @kshegunov
                Not clear, I think I'll try the native API. Thanks.

                kshegunovK Offline
                kshegunovK Offline
                kshegunov
                Moderators
                wrote on last edited by
                #14

                @jronald said in How do QThread::start and Worker::doWork related?:

                Not clear, I think I'll try the native API.

                What isn't clear exactly?

                Read and abide by the Qt Code of Conduct

                jronaldJ 1 Reply Last reply
                0
                • VRoninV VRonin

                  @jronald said in How do QThread::start and Worker::doWork related?:

                  Not clear

                  Try taking a look at https://mayaposch.wordpress.com/2011/11/01/how-to-really-truly-use-qthreads-the-full-explanation/

                  jronaldJ Offline
                  jronaldJ Offline
                  jronald
                  wrote on last edited by
                  #15

                  @VRonin Thanks, though I've almost complete my project in a native way, I'll learn Qt to see if it is excellent.

                  1 Reply Last reply
                  0
                  • kshegunovK kshegunov

                    @jronald said in How do QThread::start and Worker::doWork related?:

                    Not clear, I think I'll try the native API.

                    What isn't clear exactly?

                    jronaldJ Offline
                    jronaldJ Offline
                    jronald
                    wrote on last edited by
                    #16

                    @kshegunov

                    @kshegunov said in How do QThread::start and Worker::doWork related?:

                    @jronald said in How do QThread::start and Worker::doWork related?:

                    Not clear, I think I'll try the native API.

                    What isn't clear exactly?

                    Some questions can't be answered, for example:

                    1. what if many workers move to the same thread object
                    2. worker and QThread object are decoupled, what is the mechanism to keep both valid when working? By something like share_ptr?
                    beeckscheB kshegunovK 2 Replies Last reply
                    0
                    • jronaldJ jronald

                      @kshegunov

                      @kshegunov said in How do QThread::start and Worker::doWork related?:

                      @jronald said in How do QThread::start and Worker::doWork related?:

                      Not clear, I think I'll try the native API.

                      What isn't clear exactly?

                      Some questions can't be answered, for example:

                      1. what if many workers move to the same thread object
                      2. worker and QThread object are decoupled, what is the mechanism to keep both valid when working? By something like share_ptr?
                      beeckscheB Offline
                      beeckscheB Offline
                      beecksche
                      wrote on last edited by beecksche
                      #17

                      @jronald
                      I hope i understand your questions correctly.

                      By calling the QThread::start a new event loop is started. The objects moved to this QThread will be executed in that event loop. So if multiple objects are moved to the thread the operations are done in sequence.

                      To communicate between the objects moved to the thread and object in another thread you can use the signal/slot mechanism with queued connections.

                      Here a also useful informations: http://doc.qt.io/qt-5.8/threads-synchronizing.html and http://doc.qt.io/qt-5/threads-technologies.html

                      jronaldJ 1 Reply Last reply
                      2
                      • beeckscheB beecksche

                        @jronald
                        I hope i understand your questions correctly.

                        By calling the QThread::start a new event loop is started. The objects moved to this QThread will be executed in that event loop. So if multiple objects are moved to the thread the operations are done in sequence.

                        To communicate between the objects moved to the thread and object in another thread you can use the signal/slot mechanism with queued connections.

                        Here a also useful informations: http://doc.qt.io/qt-5.8/threads-synchronizing.html and http://doc.qt.io/qt-5/threads-technologies.html

                        jronaldJ Offline
                        jronaldJ Offline
                        jronald
                        wrote on last edited by jronald
                        #18

                        @beecksche The mechanism is general and robust, the trade off between runtime efficiency and develop efficiency while retaining the profession of C/C++ is very good.

                        1 Reply Last reply
                        0
                        • jronaldJ jronald

                          @kshegunov

                          @kshegunov said in How do QThread::start and Worker::doWork related?:

                          @jronald said in How do QThread::start and Worker::doWork related?:

                          Not clear, I think I'll try the native API.

                          What isn't clear exactly?

                          Some questions can't be answered, for example:

                          1. what if many workers move to the same thread object
                          2. worker and QThread object are decoupled, what is the mechanism to keep both valid when working? By something like share_ptr?
                          kshegunovK Offline
                          kshegunovK Offline
                          kshegunov
                          Moderators
                          wrote on last edited by
                          #19

                          @jronald said in How do QThread::start and Worker::doWork related?:

                          what if many workers move to the same thread object

                          The QObject::moveToThread method is not thread-safe. In consequence the object can be moved only from one thread and it is the one it exists in (see thread affinity). Aside from this there's no limit on how many worker objects can be moved into a thread. All the slot invocations across threads are queued (by default) in the thread's event queue and are dispatched to the relevant objects in sequence.

                          worker and QThread object are decoupled, what is the mechanism to keep both valid when working? By something like share_ptr?

                          That's up to you. I just connect all the needed signals and don't keep reference to either object, or I create them in the stack and leave the stack unwinding to take care of the objects' destruction. E.g:

                          QThread * thread = new QThread();
                          thread->start();
                          
                          QObject * worker = new QObject(); // Or whatever type your worker is.
                          worker->moveToThread(thread);
                          
                          // Connect worker and thread and w/e else is needed to be connected
                          QObject::connect(thread, &QThread::finished, worker, &QObject::deleteLater); // Takes care to delete the worker whenever the thread's quitting
                          
                          // Do unrelated stuff ... ...
                          
                          // Tell the thread to quit, wait for it and continue on
                          thread->quit();
                          thread->wait();
                          

                          As QThread is already a QObject you can have it parented which means the parent will auto-delete the children whenever it is deleted itself.

                          Read and abide by the Qt Code of Conduct

                          jronaldJ 1 Reply Last reply
                          2
                          • kshegunovK kshegunov

                            @jronald said in How do QThread::start and Worker::doWork related?:

                            what if many workers move to the same thread object

                            The QObject::moveToThread method is not thread-safe. In consequence the object can be moved only from one thread and it is the one it exists in (see thread affinity). Aside from this there's no limit on how many worker objects can be moved into a thread. All the slot invocations across threads are queued (by default) in the thread's event queue and are dispatched to the relevant objects in sequence.

                            worker and QThread object are decoupled, what is the mechanism to keep both valid when working? By something like share_ptr?

                            That's up to you. I just connect all the needed signals and don't keep reference to either object, or I create them in the stack and leave the stack unwinding to take care of the objects' destruction. E.g:

                            QThread * thread = new QThread();
                            thread->start();
                            
                            QObject * worker = new QObject(); // Or whatever type your worker is.
                            worker->moveToThread(thread);
                            
                            // Connect worker and thread and w/e else is needed to be connected
                            QObject::connect(thread, &QThread::finished, worker, &QObject::deleteLater); // Takes care to delete the worker whenever the thread's quitting
                            
                            // Do unrelated stuff ... ...
                            
                            // Tell the thread to quit, wait for it and continue on
                            thread->quit();
                            thread->wait();
                            

                            As QThread is already a QObject you can have it parented which means the parent will auto-delete the children whenever it is deleted itself.

                            jronaldJ Offline
                            jronaldJ Offline
                            jronald
                            wrote on last edited by jronald
                            #20

                            @kshegunov The signal & slot mechanism just takes thread selection into consideration, others still keep simple, right? I think it's quite good.

                            kshegunovK 1 Reply Last reply
                            0
                            • jronaldJ jronald

                              @kshegunov The signal & slot mechanism just takes thread selection into consideration, others still keep simple, right? I think it's quite good.

                              kshegunovK Offline
                              kshegunovK Offline
                              kshegunov
                              Moderators
                              wrote on last edited by
                              #21

                              I'm sorry, I don't understand the question.

                              Read and abide by the Qt Code of Conduct

                              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