[Interest] Does cross thread signal/slot connection order matter?
André Somers
andre at familiesomers.nl
Wed Jun 11 16:41:19 CEST 2014
Murphy, Sean schreef op 11-6-2014 16:00:
>
> I've got an object that I want to live in another thread, so in a
> class in my main thread I've got:
>
> // pseudo-code, may not compile
>
> QThread* thread = new QThread(this);
>
> myObject* foo = new myObject();
>
> foo ->moveToThread(thread);
>
> thread->start();
>
> But when I go to connect the signals/slots between objects in the main
> thread and the "foo" object, should I do that before I move that
> object to a different thread, or after, or does it not matter?
>
> So should it be either:
>
> QThread* thread = new QThread(this);
>
> myObject* foo = new myObject();
>
> // make calls to connect() before calling moveToThread()
>
> connect(this, SIGNAL(...),foo, SLOT(...)); // repeat as necessary for
> all my signal/slot connections
>
> foo->moveToThread(thread);
>
> thread->start();
>
> Or:
>
> QThread* thread = new QThread(this);
>
> myObject* foo = new myObject();
>
> foo->moveToThread(thread);
>
> thread->start();
>
> // make calls to connect() after calling moveToThread()
>
> connect(this, SIGNAL(...),foo, SLOT(...));// repeat as necessary for
> all my signal/slot connections
>
> Or even delaying the thread->start() call until after everything else:
>
> QThread* thread = new QThread(this);
>
> myObject* foo = new myObject();
>
> foo->moveToThread(thread);
>
> // make calls to connect() after calling moveToThread() then call
> thread->start()
>
> connect(this, SIGNAL(...),foo, SLOT(...));// repeat as necessary for
> all my signal/slot connections
>
> thread->start();
>
> I can't find any authoritative documentation that says to do it one
> way or the other, so either it doesn't exist or more likely, I'm not
> googling well. I can find lots of docs on the merits of inheriting
> from QThread vs. using the moveToThread(), but the ones I've found
> don't address this question in detail.
>
>
It doesn't matter. Qt::autConnection connections (the default connection
type) will evaluate the thread affinity of the current thread* and the
receiver at the moment of the signal emission. So, it doesn't matter if
you connect first and then move, or move first and then connect, only at
signal emission it is evaluated what mechanism to use (direct call, or
go through the event system of the receiving thread).
Note that your second example will work in this case, but may end up as
a race condition if you make a connection the other way around from a
signal on your worker to a slot in your current thread. If you start the
thread before making the connection, you run the risk that you'll miss
signals as they may be emitted before you make the connection.
*) note that the current thread _may_ not match the thread affinity of
the signal's object.
André
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.qt-project.org/pipermail/interest/attachments/20140611/722b3a24/attachment.html>
More information about the Interest
mailing list