[PyKDE] Still problems (was Re: PyQt 3.12 introduces deadlock with QCustomEvent's destructor.)

Phil Thompson phil at riverbankcomputing.co.uk
Thu Aug 19 11:37:06 BST 2004


On Thursday 19 August 2004 10:22 am, Truls A. Tangstad wrote:
> On Mon, Aug 16, 2004 at 04:10:50PM +0100, Phil Thompson wrote:
> > On Friday 06 August 2004 3:22 pm, Truls A. Tangstad wrote:
> > > It seems that the destructor of QCustomEvent causes problems/hangs
> > > just by creating an instance of it and then deleting it in a thread
> > > other than the GUI/event/main-thread. This only occurs in version 3.12
> > > of PyQt, and was not a problem in 3.11.
> > >
> > > The problem does not seem to occur when sending the event object to
> > > qt.qApp.postEvent before deleting it, even when the posting function
> > > should be the only one left with a reference to the object.
> > >
> > > One rarely creates a QCustomEvent without posting it, but the behavior
> > > is still strange.
> > >
> > > In the enclosed example two threads are started, one creates a
> > > QCustomEvent object, posts it, then deletes it, after waiting to make
> > > sure the event handler is done with it. The second thread creates a
> > > QCustomEvent object then deletes it, causing the application to hang
> > > with PyQt 3.12.
> > >
> > > I'm running on Debian Unstable using the following package versions:
> > > libqt3c102-mt       3.2.3-4
> > > python2.3-qt3       3.12-1
> > > python2.3-sip4-qt3  4.0-2
> > >
> > > [1]
> > > http://mats.imk.fraunhofer.de/pipermail/pykde/2004-August/008303.html
> >
> > Please read the PyQt documentation regarding using the Python thread
> > module with PyQt - you aren't following the guidelines.
> >
> > Attached is a version of your script which uses QThread instead and seems
> > to work fine.
>
> I've been modifying our program to use QThreads, but deadlocks (hangs)
> still occur. Some of the problems can be related to the following
> problem which I've been able to distill in the attached script, which
> is a modified version of the one you posted.
>
> When the event thread is busy in QCustomEvents destructor, posting new
> events, even from QThreads, hangs the entire application. I'm not sure
> if this is specific to QCustomEvents destructor or that postEvent has
> greater issues though.
>
> I'm currently running Debian Unstable using the following package versions:
> libqt3c102-mt       3.3.3-3
> python2.3-qt3       3.12-2
> python2.3-sip4-qt3  4.0.1-1

This *is* a PyQt bug. Change the definition of postEvent() in qapplication.sip 
to...

static void postEvent(QObject *,QEvent * /Transfer/) /ReleaseGIL/;

You may also want to add /ReleaseGIL/ to sendEvent(), sendPostedEvents() and 
notify() if you use them.

The fix will be in tonight's snapshot.

Phil




More information about the PyQt mailing list