Return to site

Qt Execute Slot Without Signal

broken image


Home · All Classes · Modules

The QThread class provides a platform-independent way to managethreads. More..

Inherits QObject.

The connection type is determined when the signal is emitted. Qt::DirectConnection: This slot is invoked immediately when the signal is emitted. The slot is executed in the signaling thread. Qt::QueuedConnection: The slot is invoked when control returns to the event loop of the receiver's thread. The slot is executed in the receiver's thread. When called from the object thread, it will be executed immediately (not queued). Note that the started signal is emitted only when the thread is started. This means that doTask method invocation queued before the thread is started will execute before the started method slot is invoked.

TypeError: native Qt signal is not callable The Question Honestly, at this point I have pretty much no idea where to go with this or what details you may need to diagnose the problem. I have a Qt 'signal-slot connection'. I want to test the class with the signal The class with the slot is mocked/stubbed. Now I would like to verify that when I emit signal, the slot is called. I wonder if it is possible to use gmock to verify this. // class Tx contains the signal, which is protected so I inherit // to get access to it.

Types

  • enum Priority { IdlePriority, LowestPriority, LowPriority, NormalPriority, .., InheritPriority }

Methods

  • int exec_ (self)
  • bool isFinished (self)
  • Priority priority (self)
  • run (self)
  • setStackSize (self, int stackSize)
  • start (self, Priority priority = QThread.InheritPriority)
  • bool wait (self, int msecs = ULONG_MAX)

Static Methods

  • int currentThreadId ()
  • msleep (int)
  • sleep (int)
  • yieldCurrentThread ()

Qt Signals

  • void started ()

Detailed Description

The QThread class provides a platform-independent way to managethreads.

A QThread object manages one thread of control within theprogram. QThreads begin executing in run(). By default, run() starts the event loop by callingexec_() and runs a Qt event loopinside the thread.

You can use worker objects by moving them to the thread usingQObject.moveToThread().

The code inside the Worker's slot would then execute in aseparate thread. However, you are free to connect the Worker'sslots to any signal, from any object, in any thread. It is safe toconnect signals and slots across different threads, thanks to amechanism called queuedconnections.

Another way to make code run in a separate thread, is tosubclass QThread and reimplement run(). For example:

Qt Execute Slot Without Signal Generator

In that example, the thread will exit after the run function hasreturned. There will not be any event loop running in the threadunless you call exec_().

It is important to remember that a QThread instance lives in the old thread thatinstantiated it, not in the new thread that calls run(). This means that all of QThread'squeued slots will execute in the old thread. Thus, a developer whowishes to invoke slots in the new thread must use the worker-objectapproach; new slots should not be implemented directly into asubclassed QThread.

When subclassing QThread, keep in mind that the constructorexecutes in the old thread while run() executes in the new thread. If amember variable is accessed from both functions, then the variableis accessed from two different threads. Check that it is safe to doso.

Note: Care must be taken when interacting with objectsacross different threads. See Synchronizing Threads fordetails.

Managing threads

QThread will notifiy you via a signal when the thread isstarted(), finished(), and terminated(), or you can use isFinished() and isRunning() to query the state of thethread.

You can stop the thread by calling exit() or quit(). In extreme cases, you may want toforcibly terminate() anexecuting thread. However, doing so is dangerous and discouraged.Please read the documentation for terminate() and setTerminationEnabled()for detailed information.

From Qt 4.8 onwards, it is possible to deallocate objects thatlive in a thread that has just ended, by connecting the finished() signal to QObject.deleteLater().

Use wait() to block the callingthread, until the other thread has finished execution (or until aspecified time has passed).

The static functions currentThreadId() and currentThread() return identifiersfor the currently executing thread. The former returns a platformspecific ID for the thread; the latter returns a QThreadpointer.

To choose the name that your thread will be given (as identifiedby the command ps -L on Linux, for example), you can callsetObjectName() beforestarting the thread. If you don't call setObjectName(), the name givento your thread will be the class name of the runtime type of yourthread object (for example, 'RenderThread' in the case ofthe Mandelbrot Example, asthat is the name of the QThread subclass). Note that this iscurrently not available with release builds on Windows.

QThread also provides static, platform independent sleepfunctions: sleep(), msleep(), and usleep() allow full second, millisecond,and microsecond resolution respectively.

Note:wait() and thesleep() functions should beunnecessary in general, since Qt is an event-driven framework.Instead of wait(), considerlistening for the finished()signal. Instead of the sleep()functions, consider using QTimer.

{Mandelbrot Example}, {Semaphores Example}, {Wait ConditionsExample}

Type Documentation

QThread.Priority

ConstantValueDescription
QThread.IdlePriority0scheduled only when no other threads arerunning.
QThread.LowestPriority1scheduled less often than LowPriority.
QThread.LowPriority2scheduled less often than NormalPriority.
QThread.NormalPriority3the default priority of the operatingsystem.
QThread.HighPriority4scheduled more often than NormalPriority.
QThread.HighestPriority5scheduled more often than HighPriority.
QThread.TimeCriticalPriority6scheduled as often as possible.
QThread.InheritPriority7use the same priority as the creating thread.This is the default.

Method Documentation

QThread.__init__ (self, QObjectparent = None)

The parent argument, if not None, causes self to be owned by Qt instead of PyQt.

Constructs a new QThread to manage anew thread. The parent takes ownership of the QThread. The thread does not begin executinguntil start() is called.

See alsostart().

QThread QThread.currentThread ()

Returns a pointer to a QThread whichmanages the currently executing thread.

int QThread.currentThreadId ()

int QThread.exec_ (self)

Enters the event loop and waits until exit() is called, returning the value thatwas passed to exit(). The valuereturned is 0 if exit() is calledvia quit().

This function is meant to be called from within run(). It is necessary to call this functionto start event handling.

See alsoquit() andexit().

QThread.exit (self, int returnCode = 0)

After calling this function, the thread leaves the event loopand returns from the call to QEventLoop.exec(). The QEventLoop.exec() function returnsreturnCode.

Qt Execute Slot Without Signal Number

By convention, a returnCode of 0 means success, anynon-zero value indicates an error.

Note that unlike the C library function of the same name, thisfunction does return to the caller -- it is event processingthat stops.

Qt Execute Slot Without Signal Test

No QEventLoops will be started anymore in this thread untilQThread.exec() has been calledagain. If the eventloop in QThread.exec() is not running then thenext call to QThread.exec() willalso return immediately.

See alsoquit() andQEventLoop.

int QThread.idealThreadCount ()

bool QThread.isFinished (self)

See alsoisRunning().

Qt Execute Slot Without Signal Booster

bool QThread.isRunning (self)

See alsoisFinished().

QThread.msleep (int)

See alsosleep() andusleep().

Priority QThread.priority (self)

Returns the priority for a running thread. If the thread is notrunning, this function returns InheritPriority.

This function was introduced in Qt 4.1.

See alsoPriority, setPriority(), and start().

QThread.quit (self)

See alsoexit() andQEventLoop.

QThread.run (self)

The starting point for the thread. After calling start(), the newly created thread callsthis function. The default implementation simply calls exec_().

You can reimplement this function to facilitate advanced threadmanagement. Returning from this method will end the execution ofthe thread.

See alsostart() andwait().

QThread.setPriority (self, Prioritypriority)

This function sets the priority for a running thread. Ifthe thread is not running, this function does nothing and returnsimmediately. Use start() to starta thread with a specific priority.

The priority argument can be any value in theQThread.Priority enum except forInheritPriorty.

The effect of the priority parameter is dependent on theoperating system's scheduling policy. In particular, thepriority will be ignored on systems that do not supportthread priorities (such as on Linux, seehttp://linux.die.net/man/2/sched_setscheduler for moredetails).

This function was introduced in Qt 4.1.

See alsoPriority, priority(), and start().

QThread.setStackSize (self, int stackSize)

See alsostackSize().

QThread.setTerminationEnabled (bool enabled = True)

Enables or disables termination of the current thread based onthe enabled parameter. The thread must have been started byQThread.

When enabled is false, termination is disabled. Futurecalls to QThread.terminate()will return immediately without effect. Instead, the termination isdeferred until termination is enabled.

When enabled is true, termination is enabled. Futurecalls to QThread.terminate()will terminate the thread normally. If termination has beendeferred (i.e. QThread.terminate() was called withtermination disabled), this function will terminate the callingthread immediately. Note that this function will not returnin this case.

See alsoterminate().

QThread.sleep (int)

See alsomsleep() andusleep().

int QThread.stackSize (self)

Returns the maximum stack size for the thread (if set withsetStackSize()); otherwisereturns zero.

See alsosetStackSize().

QThread.start (self, Prioritypriority = QThread.InheritPriority)

This method is also a Qt slot with the C++ signature void start(QThread::Priority = QThread.InheritPriority).

Begins execution of the thread by calling run(). The operating system will schedulethe thread according to the priority parameter. If thethread is already running, this function does nothing.

The effect of the priority parameter is dependent on theoperating system's scheduling policy. In particular, thepriority will be ignored on systems that do not supportthread priorities (such as on Linux, seehttp://linux.die.net/man/2/sched_setscheduler for moredetails).

See alsorun() andterminate().

Can sloths burp. Over 6,192 FREE Online Slots Games to play (2020) - Play free slot machines from the top providers. Play Instantly, No Download or Registration required! Free Slots – Play 7780+ Free Online Casino Games. You've just discovered the biggest online, free slots library. Like thousands of slots players who use VegasSlotsOnline.com every day, you now have instant access to over 7780 free online slots that you can play right here. Play 30+ FREE 3-reel and 5-reel slots: Mountain Fox, Treasures of Egypt, Flaming Crates, Prosperous Fortune, Magic Wheel, Fruit Smoothie, Party Bonus, Video Poker and more!

QThread.terminate (self)

Terminates the execution of the thread. The thread may or maynot be terminated immediately, depending on the operating system'sscheduling policies. Listen for the terminated() signal, or use QThread.wait() after terminate(), to besure.

When the thread is terminated, all threads waiting for thethread to finish will be woken up.

Warning: This function is dangerous and its use isdiscouraged. The thread can be terminated at any point in its codepath. Threads can be terminated while modifying data. There is nochance for the thread to clean up after itself, unlock any heldmutexes, etc. In short, use this function only if absolutelynecessary.

Termination can be explicitly enabled or disabled by callingQThread.setTerminationEnabled().Calling this function while termination is disabled results in thetermination being deferred, until termination is re-enabled. Seethe documentation of QThread.setTerminationEnabled()for more information.

See alsosetTerminationEnabled().

QThread.usleep (int)

See alsosleep() andmsleep().

bool QThread.wait (self, int msecs = ULONG_MAX)

  • The thread associated with this QThread object has finished execution (i.e. whenit returns from run()). Thisfunction will return true if the thread has finished. It alsoreturns true if the thread has not been started yet.
  • time milliseconds has elapsed. If time isULONG_MAX (the default), then the wait will never timeout (thethread must return from run()). Thisfunction will return false if the wait timed out.

This provides similar functionality to the POSIXpthread_join() function.

See alsosleep() andterminate().

QThread.yieldCurrentThread ()

Qt Signal Documentation

void finished ()

See alsostarted() andterminated().

void started ()

See alsofinished()and terminated().

void terminated ()

See alsostarted() andfinished().

PyQt 4.11.4 for X11Copyright © Riverbank Computing Ltd and The Qt Company 2015Qt 4.8.7

A short history

Long long ago, subclass QThread and reimplement its run() function is the only recommended way of using QThread. This is rather intuitive and easy to used. But when SLOTS and Qt event loop are used in the worker thread, some users do it wrong. So Bradley T. Hughes, one of the Qt core developers, recommend that use worker objects by moving them to the thread using QObject::moveToThread . Unfortunately, some users went on a crusade against the former usage. So Olivier Goffart, one of the former Qt core developers, tell the subclass users: You were not doing so wrong. Finally, we can find both usages in the documentation of QThread.

QThread::run() is the thread entry point

From the Qt Documentation, we can see that

A QThread instance represents a thread and provides the means to start() a thread, which will then execute the reimplementation of QThread::run(). The run() implementation is for a thread what the main() entry point is for the application.

As QThread::run() is the thread entry point, it is rather intuitive to use the Usage 1.

Usage 1-0

To run some code in a new thread, subclass QThread and reimplement its run() function.

For example

The output more or less look like:

Usage 1-1

As QThread::run() is the thread entry point, so it easy to undersand that, all the codes that are not get called in the run() function directly won't be executed in the worker thread.

In the following example, the member variable m_stop will be accessed by both stop() and run(). Consider that the former will be executed in main thread while the latter is executed in worker thread, mutex or other facility is needed.

The output is more or less like

You can see that the Thread::stop() is executed in the main thread.

Usage 1-2 (Wrong Usage)

Though above examples are easy to understand, but it's not so intuitive when event system(or queued-connection) is introduced in worker thread.

Qt Execute Slot Without Signal

For example, what should we do if we want to do something periodly in the worker thread?

  • Create a QTimer in the Thread::run()
  • Connect the timeout signal to the slot of Thread

At first glance, the code seems fine. When the thread starts executing, we setup a QTimer thats going to run in the current thread's event queue. We connect the onTimeout() to the timeout signal. Then we except it works in the worker thread?

But, the result of the example is

Oh, No!!! They get called in the main thread instead of the work thread.

Very interesting, isn't it? (We will discuss what happened behined this in next blog)

How to solve this problem

In order to make the this SLOT works in the worker thread, some one pass the Qt::DirectConnection to the connect() function,

and some other add following line to the thread constructor.

Both of them work as expected. But ..

The second usage is wrong,

Even though this seems to work, it's confusing, and not how QThread was designed to be used(all of the functions in QThread were written and intended to be called from the creating thread, not the thread that QThread starts)

In fact, according to above statements, the first workaround is wrong too. As onTimeout() which is a member of our Thread object, get called from the creating thread too.

Both of them are bad uasge?! what should we do?

Usage 1-3

As none of the member of QThread object are designed to be called from the worker thread. So we must create an independent worker object if we want to use SLOTS.

The result of the application is

Problem solved now!

Though this works perfect, but you may have notice that, when event loop QThread::exec() is used in the worker thread, the code in the QThread::run() seems has nothing to do with QThread itself.

So can we move the object creation out of the QThread::run(), and at the same time, the slots of they will still be called by the QThread::run()?

Usage 2-0

If we only want to make use of QThread::exec(), which has been called by QThread::run() by default, there will be no need to subclass the QThread any more.

  • Create a Worker object
  • Do signal and slot connections
  • Move the Worker object to a sub-thread
  • Start thread

The result is:

As expected, the slot doesn't run in the main thread.

In this example, both of the QTimer and Worker are moved to the sub-thread. In fact, moving QTimer to sub-thread is not required.

Simply remove the line timer.moveToThread(&t); from above example will work as expected too.

The difference is that:

In last example,

  • The signal timeout() is emitted from sub-thread
  • As timer and worker live in the same thread, their connection type is direct connection.
  • The slot get called in the same thead in which signal get emitted.

While in this example,

  • The signal timeout() emitted from main thread,
  • As timer and worker live in different threads, their connection type is queued connection.
  • The slot get called in its living thread, which is the sub-thread.

Thanks to a mechanism called queued connections, it is safe to connect signals and slots across different threads. If all the across threads communication are done though queued connections, the usual multithreading precautions such as QMutex will no longer need to be taken.

In short

  • Subclass QThread and reimplement its run() function is intuitive and there are still many perfectly valid reasons to subclass QThread, but when event loop is used in worker thread, it's not easy to do it in the right way.
  • Use worker objects by moving them to the thread is easy to use when event loop exists, as it has hidden the details of event loop and queued connection.

Reference

  • http://blog.qt.digia.com/blog/2010/06/17/youre-doing-it-wrong/
  • http://woboq.com/blog/qthread-you-were-not-doing-so-wrong.html
  • http://ilearnstuff.blogspot.com/2012/08/when-qthread-isnt-thread.html




broken image