[Qt-interest] Qt signaling smarts...

BRM bm_witness at yahoo.com
Tue Nov 24 18:52:01 CET 2009


----- Original Message ----

From: Thiago Macieira <thiago at kde.org>
Em Terça-feira 24 Novembro 2009, às 16:54:04, BRM escreveu:
> > Assume the following:
> >  - that the mainProgram class creates two threads - one based on QThread1
> >  and the other based on QThread2. - that thread1Signal() is generated by an
> >  internal instance class - that thread2Signal() interfaces to the slot of
> >  an internal instance class - the 'this' pointer refers to the main
> >  program.
> >  - myQThread1 is an instance of QThread1.
> >  - myQThread2 is an instance of QThread2.
> >  - there may be multiple instances of QThread1 and QThread2, though
> >  typically only one instance of QThread1 at a time.
> > Suppose the following connections are made by an instance of the
> >  mainProgram: - connect(&myQThread1,SIGNAL(thread1Signal()),
> >  this,SIGNAL(thread1SignalToThread2Signal()) - connect(this,
> >  SIGNAL(thread1SignalToThread2Signal()), &myQThread2,
> >  SIGNAL(thread2Signal())
> > QThread1::thread1Signal() -> mainProgram::thread1SignalToThread2Signal() ->
> >  QThread2::thread2Signal()
> > Question:
> > - Is the Qt signal/slots mechanism smart enough to determine that the
> >  thread1SignalToThread2Signal() does not need to exist and could be
> >  eliminated (thus QThread1::thread1Signal() directly calls
> >  QThread2::thread2Signal() ) ? 
> No. A signal-to-signal connection works by emitting the target signal. Then 
> the target signal's actions are performed the way they would have been if the 
> signal had been emitted directly.
> If any of the connections are queued, this will cause queueing.
> >  Or would the signal generation have to wait
> >  until the event loop in the mainProgram's thread to call the second worker
> >  thread?
> Yes, it would wait. If thread1Signal() is emitted inside thread 1's run() 
> function, then the first connection above is a queued connection. That means 
> the main thread's event loop will need to catch the queued connection and then 
> it would emit thread1SignalToThread2Signal() in the main thread.
> That will cause thread2Signal() to be emitted in the _main_ thread again, 
> since that's the thread that myQThread2 is attached to.
> > Basically, do I need to try to figure out how to keep track of the instance
> >  of QThread1 so that I can directly connect their signals, or will Qt do
> >  some stuff for me already?
> I did not understand the question.

That last one I was just re-stating the previous questions in slightly different terms.

Thank you very much for answering my question. Looks like I will need to figure out how
to track the QThread1 object so I can make queued connections directly between
the two threads without having it go through the main thread.

Thanks!

Ben





More information about the Qt-interest-old mailing list