[PyQt] Signals arriving after proxy slots deleted

Andrew Suffield asuffield at suffields.me.uk
Sat Apr 14 22:33:02 BST 2012

On Sat, Apr 14, 2012 at 03:14:28PM +0100, Phil Thompson wrote:
> Once the C++ disconnect() has completed then it shouldn't matter if the
> proxy is still around or not. Has the disconnect() actually succeeded?

Hmm, interesting question. How do I tell?

I should note that it's difficult to test because this is a race
condition which occurs infrequently - one of these pops up somewhere
between 1/10 and 1/100 of the time.

Also, the signals are always arriving via sendPostedEvents - this is
always cross-thread stuff. The object with the slot always lives in
the QThread where it was created, so I assume that
QNetworkAccessManager has its own worker threads and is posting the
signals from there. Presumably the signal was emitted before the
disconnect() and arrived as soon as control passed back to the event
loop, but that's speculation.

Since (as far as I understand it) with the C++ Qt interface you are
supposed to be able to disconnect a slot and then immediately delete
its object, there must be something in Qt which ensures posted events
don't get delivered for disconnected slots. Perhaps it has been broken

Bit of a head-scratcher really - I can see this isn't supposed to
break, so something somewhere is wrong. Unfortunately that means pyqt,
qt, and all of my own code are in scope as possible culprits.

More information about the PyQt mailing list