[PyKDE] Re: Threading problem with PyQt4 and Macosx

Matt Newell newellm at blur.com
Mon Feb 26 23:47:55 GMT 2007


> >
> > It seems that I need to work out how to find the thread affinity of a
> > Python object...
>
> ...which doesn't seem possible. So I think it's a case of clarifying the
> documentation...
>
Shouldn't this be possible for python callable's that are members of a QObject 
derived python class?  

> If you connect to a SLOT() then the slot is executed in the thread as
> described in the Qt documentation.
>
> If you connect to a Python callable then the slot is executed according to
> the same rules with the additional proviso that a SLOT is created on the
> fly in the thread in which the call to connect() is made.
If the slot(python callable) is a member of a python class that is derived 
from QObject, then the PyQtProxy object created should then be moved to the 
same thread that the QObject is in, using QObject::moveToThread.  That way 
the slot is called in the same thread as the QObject, which follow the same 
behavior as qt.  The only exception will be when a python callable that is 
not a member of a QObject derived class is used, then it will be called in 
whatever thread the connect call is made.

> You can then get your sample-thread example working by either moving the
> connect() call to the __init__() method, or by making the connection a
> direct one (or an auto one). In the first case the slot will execute in the
> main thread, and in the second it will execute in the sub-thread. As the
> slot is updating the GUI then you want to do the former.
>
> Matt - does this explanation still mean that the GIL needs to be released
> in QObject ctors etc? Or have I got 2 separate issues confused?
>
They are 2 separate issues, but after reviewing the relevant qt code I'm not 
sure if it will be required to release the GIL for qobject ctors/dtors.  It 
may work to require the GIL to be *LOCKED* whenever calling qt code that can 
hold a qt lock while calling back into python code(emit calling 
qmetatype::construct is currently the only place I know of).  

I'm still not 100% sure about all this though, and I think there may be a way 
to eliminate the deadlock situation by a simple change to the qt code.  I 
need more time to think about it, it kind of makes my head hurt:)

Matt
> Phil
>
> _______________________________________________
> PyKDE mailing list    PyKDE at mats.imk.fraunhofer.de
> http://mats.imk.fraunhofer.de/mailman/listinfo/pykde




More information about the PyQt mailing list