[PyKDE] Using thread and event filter crashes Python
Phil Thompson
phil at riverbankcomputing.co.uk
Sun Jul 10 18:44:25 BST 2005
On Wednesday 06 July 2005 9:40 am, Yann COINTEPAS wrote:
> Setting an event filter to the QApplication singleton and using threads
> lead to a Python crash due to a double deletion of a widget (at Python
> level). This happens with PyQt 3.14.1 and sip 4.2.1. I don't know if it is
> the same for other versions.
>
> For example, the following code:
>
> import sys, threading
> from qt import *
>
> class EventFilter( QObject ):
> def eventFilter( self, o, e ):
> return False
>
> class TestWidget( QWidget ):
> def __init__( self ):
> print '!init TestWidget!', threading.currentThread()
> QWidget.__init__( self )
>
> def __del__( self ):
> print '!del TestWidget!', threading.currentThread()
>
> def createWidget():
> qApp.lock()
> try:
> w = TestWidget()
> w.show()
> del w
> finally:
> qApp.unlock()
>
>
> app = QApplication( sys.argv )
>
> theEventFilter = EventFilter()
> qApp.installEventFilter( theEventFilter )
>
> main = QLabel( 'main', None )
> main.show()
> app.setMainWidget( main )
>
> t = threading.Thread( target=createWidget )
> t.start()
>
> app.exec_loop()
>
>
> Produces the following output:
>
> !init TestWidget! <Thread(Thread-1, started)>
> !del TestWidget! <Thread(Thread-1, started)>
> !del TestWidget! <Thread(Thread-1, started)>
> Segmentation fault
>
> I even try to create widgets only from the main thread (instead of using
> qApp.lock/qApp.unlock) by using a QTimer and a queue of functions and
> arguments. But the result is the same.
With current snapshots I don't get the double delete and get a SIGKILL rather
than a seg fault.
The above code definately breaks Qt's rules - you must must create QWidgets in
the main GUI thread. I need another example that demonstrate's the problem
but conforms to Qt's rules.
Phil
More information about the PyQt
mailing list