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. Do Non GUI threads again start executing( signal/slot events ),after they come to rest ?
Qt 6.11 is out! See what's new in the release blog

Do Non GUI threads again start executing( signal/slot events ),after they come to rest ?

Scheduled Pinned Locked Moved General and Desktop
10 Posts 3 Posters 3.0k 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.
  • B Offline
    B Offline
    blue_sky
    wrote on last edited by
    #1

    suppose, a non GUI thread finished executing its codes. after which it gets an event(SIGNAL) to execute a slot of an Object, Which was created inside that Non GUI thread.
    Now, Who will perform this task?The NON-GUI thread/ the main GUI thread, which is still alive?

    1 Reply Last reply
    0
    • JKSHJ Offline
      JKSHJ Offline
      JKSH
      Moderators
      wrote on last edited by
      #2

      Hi,

      The thread needs a running event loop to process signals. If your event loop has stopped, then the slot of the object that was created inside the non-GUI thread will never get executed.

      Qt Doc Search for browsers: forum.qt.io/topic/35616/web-browser-extension-for-improved-doc-searches

      1 Reply Last reply
      0
      • B Offline
        B Offline
        blue_sky
        wrote on last edited by
        #3

        So its all depends on event loop. But What happened generally for a secondary thread. IS the event loop is destroyed, or exists till the end f the application?
        [quote author="JKSH" date="1385208687"]Hi,

        The thread needs a running event loop to process signals. If your event loop has stopped, then the slot of the object that was created inside the non-GUI thread will never get executed.[/quote]

        1 Reply Last reply
        0
        • M Offline
          M Offline
          MuldeR
          wrote on last edited by
          #4

          With a direct connection, the Slot will be executed by the thread who has emitted the Signal. In this case, the emit() will block until the Slot has been executed. If, instead, a queued connection is used, the emit() will simply put the Signal into the queue of the thread to which the receiver object belongs to. So the Slot will be called, eventually, by the thread to which the object belongs. This requires the thread to be running an event loop. If that thread does not run an event loop, the Slot will not be executed. Also, Signals that are received while the thread does not run an event loop are not lost. They will be processed as soon as an event loop is created and run in the thread.

          BTW: Running an event loop does not require GUI components. Non-GUI threads may be running an event loop just as well...

          My OpenSource software at: http://muldersoft.com/

          Qt v4.8.6 MSVC 2013, static/shared: http://goo.gl/BXqhrS

          Go visit the coop: http://youtu.be/Jay...

          1 Reply Last reply
          0
          • JKSHJ Offline
            JKSHJ Offline
            JKSH
            Moderators
            wrote on last edited by
            #5

            [quote author="blue_sky" date="1385233583"]But What happened generally for a secondary thread. IS the event loop is destroyed, or exists till the end f the application?[/quote]The event loop in the main thread will keep running until you quit the application by calling QCoreApplication::quit() (this might be called automatically if you close all your windows).

            A secondary thread's event loop will keep running until you stop the thread by calling QThread::quit() (this is not called automatically).

            Qt Doc Search for browsers: forum.qt.io/topic/35616/web-browser-extension-for-improved-doc-searches

            1 Reply Last reply
            0
            • B Offline
              B Offline
              blue_sky
              wrote on last edited by
              #6

              what do you ean by- Non GUI threads may run event loop?What decides running of event loop for non gui thread?
              A secondary thread comes to rest does not mean that- event loop of that thread is destroyed?Correct if I am wrong?
              [quote author="MuldeR" date="1385237250"]With a direct connection, the Slot will be executed by the thread who has emitted the Signal. In this case, the emit() will block until the Slot has been executed. If, instead, a queued connection is used, the emit() will simply put the Signal into the queue of the thread to which the receiver object belongs to. So the Slot will be called, eventually, by the thread to which the object belongs. This requires the thread to be running an event loop. If that thread does not run an event loop, the Slot will not be executed. Also, Signals that are received while the thread does not run an event loop are not lost. They will be processed as soon as an event loop is created and run in the thread.

              BTW: Running an event loop does not require GUI components. Non-GUI threads may be running an event loop just as well...[/quote]

              1 Reply Last reply
              0
              • B Offline
                B Offline
                blue_sky
                wrote on last edited by
                #7

                Thank you. now its clear that- A threads event loop is still present , whether thread is running or at rest.
                [quote author="JKSH" date="1385256647"][quote author="blue_sky" date="1385233583"]But What happened generally for a secondary thread. IS the event loop is destroyed, or exists till the end f the application?[/quote]The event loop in the main thread will keep running until you quit the application by calling QCoreApplication::quit() (this might be called automatically if you close all your windows).

                A secondary thread's event loop will keep running until you stop the thread by calling QThread::quit() (this is not called automatically).[/quote]

                1 Reply Last reply
                0
                • M Offline
                  M Offline
                  MuldeR
                  wrote on last edited by
                  #8

                  [quote author="blue_sky" date="1385290197"]what do you ean by- Non GUI threads may run event loop?What decides running of event loop for non gui thread?[/quote]

                  You do!

                  By creating a QEventLoop object in that thread object an calling exec().

                  Usually in the "main" thread you will not explicitly create a QEventLoop and just use QApplication::exec(). But it doesn't mean you couldn't create your own additional QEventLoop objects in the main thread as well. For example, to wait for something in a "synchronous" way (and still have to GUI responsive) you can do something like that, even in the "main" thread:

                  @MyTask someTask;
                  QEventLoop myLoop;

                  connect(&someTask, SIGNAL(done()), &myLoop, SLOT(quit()));
                  someTask->start();

                  qDebug("Task started, begin event processing...");
                  myLoop->exec();
                  qDebug("Task completed.");@

                  _

                  [quote author="blue_sky" date="1385290197"]A secondary thread comes to rest does not mean that- event loop of that thread is destroyed?Correct if I am wrong?[/quote]

                  Not sure what "comes to rest" is supposed to mean?

                  Anyway, to have the thread run an event loop you would do the following - and that's exactly what the default implementation of QThread::run() does:
                  @QEventLoop myLoop;
                  myLoop.exe()@

                  That loop is destroyed when exec() returns and "myLoop" goes out of scope, that's simple C++ and there's no secret Qt magic behind it ;-)

                  My OpenSource software at: http://muldersoft.com/

                  Qt v4.8.6 MSVC 2013, static/shared: http://goo.gl/BXqhrS

                  Go visit the coop: http://youtu.be/Jay...

                  1 Reply Last reply
                  0
                  • B Offline
                    B Offline
                    blue_sky
                    wrote on last edited by
                    #9

                    Thank you SIr. So all secondary threads created in main thread by default having their own event loops.When secondary thread finishes executing its codes,does event loop of that thread is destroyed automatically?
                    [quote author="MuldeR" date="1385299107"][quote author="blue_sky" date="1385290197"]what do you ean by- Non GUI threads may run event loop?What decides running of event loop for non gui thread?[/quote]

                    You do!

                    By creating a QEventLoop object in that thread object an calling exec().

                    Usually in the "main" thread you will not explicitly create a QEventLoop and just use QApplication::exec(). But it doesn't mean you couldn't create your own additional QEventLoop objects in the main thread as well. For example, to wait for something in a "synchronous" way (and still have to GUI responsive) you can do something like that, even in the "main" thread:

                    @MyTask someTask;
                    QEventLoop myLoop;

                    connect(&someTask, SIGNAL(done()), &myLoop, SLOT(quit()));
                    someTask->start();

                    qDebug("Task started, begin event processing...");
                    myLoop->exec();
                    qDebug("Task completed.");@

                    _

                    [quote author="blue_sky" date="1385290197"]A secondary thread comes to rest does not mean that- event loop of that thread is destroyed?Correct if I am wrong?[/quote]

                    Not sure what "comes to rest" is supposed to mean?

                    Anyway, to have the thread run an event loop you would do the following - and that's exactly what the default implementation of QThread::run() does:
                    @QEventLoop myLoop;
                    myLoop.exe()@

                    That loop is destroyed when exec() returns and "myLoop" goes out of scope, that's simple C++ and there's no secret Qt magic behind it ;-)[/quote]

                    [quote author="MuldeR" date="1385299107"][quote author="blue_sky" date="1385290197"]what do you ean by- Non GUI threads may run event loop?What decides running of event loop for non gui thread?[/quote]

                    You do!

                    By creating a QEventLoop object in that thread object an calling exec().

                    Usually in the "main" thread you will not explicitly create a QEventLoop and just use QApplication::exec(). But it doesn't mean you couldn't create your own additional QEventLoop objects in the main thread as well. For example, to wait for something in a "synchronous" way (and still have to GUI responsive) you can do something like that, even in the "main" thread:

                    @MyTask someTask;
                    QEventLoop myLoop;

                    connect(&someTask, SIGNAL(done()), &myLoop, SLOT(quit()));
                    someTask->start();

                    qDebug("Task started, begin event processing...");
                    myLoop->exec();
                    qDebug("Task completed.");@

                    _

                    [quote author="blue_sky" date="1385290197"]A secondary thread comes to rest does not mean that- event loop of that thread is destroyed?Correct if I am wrong?[/quote]

                    Not sure what "comes to rest" is supposed to mean?

                    Anyway, to have the thread run an event loop you would do the following - and that's exactly what the default implementation of QThread::run() does:
                    @QEventLoop myLoop;
                    myLoop.exe()@

                    That loop is destroyed when exec() returns and "myLoop" goes out of scope, that's simple C++ and there's no secret Qt magic behind it ;-)[/quote]

                    1 Reply Last reply
                    0
                    • M Offline
                      M Offline
                      MuldeR
                      wrote on last edited by
                      #10

                      [quote author="blue_sky" date="1385313377"]Thank you SIr. So all secondary threads created in main thread by default having their own event loops.When secondary thread finishes executing its codes,does event loop of that thread is destroyed automatically?[/quote]

                      "Secondary" threads, as you call them, do not run an event loop by default. A thread won't be running an event loop, unless one is created and run (see examble above). It's just that the default implementation of QThread::run() happens to create and run an event loop. So if you create/start an instance of the original QThread, it will be running an event loop, indeed. But if you sublcass QThread and overwrite run(), then it will not be running an event loop! - unless you create and run the event loop yourself.

                      Furthermore, once QEventLoop::exec() has been called, the event loop will continue to run for an arbitrary amount of time - until it exists. This can happen, for example, when the quit() slot or the exit() function of the individual event loop is invoked. It also happens when QThread::quit() is called - given that the thread is actually running an event loop.

                      After an event loop exists from it's exec() method, it stops processing events - for now. But the event loop object continues to exists and exec() can be called again! The event loop is not "destroyed" until the QEventLoop object is destroyed, e.g. because it goes out of scope - and that's simple C++ logic!

                      @MyThread::run(void)
                      {
                      //No event loop running yet!
                      DoInitializationStuff();

                      //Let's start event processing at this point :-)
                      QEventLoop myLoop;
                      myLoop.exec();
                      
                      //Event processing has stopped
                      //But 'myLoop' will not be destroyed, until it goes out of scope!
                      DoFinalizationStuff(); 
                      

                      }
                      @

                      My OpenSource software at: http://muldersoft.com/

                      Qt v4.8.6 MSVC 2013, static/shared: http://goo.gl/BXqhrS

                      Go visit the coop: http://youtu.be/Jay...

                      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