>> 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). 

That's what I assumed, but wasn't sure.

> 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.

I do have signals going both ways so I'll make sure to not use option #2!

Thanks, 
Sean

_______________________________________________
Interest mailing list
Interest@qt-project.org
http://lists.qt-project.org/mailman/listinfo/interest

Reply via email to