This problem might be somewhat related to my last post "PyQt 3.12
introduces race condition/deadlock with QApplication.postEvent." (see
[1])
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
--
Truls A. Tangstad - <[EMAIL PROTECTED] e r o c a m p.org>
import qt
import thread
import time
def trig():
thread.start_new_thread(working, ())
thread.start_new_thread(broken, ())
def working():
print "Working"
qEvent = qt.QCustomEvent(1234)
qt.qApp.postEvent(qt.qApp, qEvent)
# wait to make sure main thread has handled the event and this function is
# the only place having a reference to it
time.sleep(0.5)
print "deleting event"
del qEvent
print "deleted event\n"
def broken():
# let working finish
time.sleep(1)
print "Broken"
qEvent = qt.QCustomEvent(1234)
print "deleting event"
del qEvent
print "deleted event"
qApp = qt.QApplication([])
# make sure code isn't run until event thread has started
qt.QTimer.singleShot(0, trig)
# exit application when done
qt.QTimer.singleShot(2500, qt.qApp.exit)
qApp.exec_loop()
print "No problems if you've come this far"