[PyKDE] Threading, PyQt and SIP

Claus, Richard claus at slac.stanford.edu
Mon Mar 22 03:20:01 GMT 2004

 I've written a library in C++ that takes a buffer of data and calls back application resolved virtual methods based on the contents of the buffer.  All the work is done in place, so there is no memory management other than temporaries created on the stack.  It would be very useful for us if this library were also available from Python, so I've used SIP 3.10.1 (snapshot 20040313-194) to expose its interface.  I haven't tried to do anything tricky with %MethodCode or anything like that.

The results on Windows XP (Python 2.3.3, MSVS .Net 7.1) so far:

- With a pure C++ application dynamically linked against this library, I have seen no problems and everything works as expected.
- With single and multi-threaded, non-PyQt applications, I have seen no problems and everything works as expected.
- With PyQt applications, I see no problems when I use the library from the Qt GUI thread (the one running QApplication.exec_loop()).
- With PyQt applications, there are problems when I use the library from a non-GUI thread.  Often Python crashes with "Fatal Python error: GC object already tracked".  With Python 2.2, the message was something like "...GC object already on linked list".  Other crashes are access violations in seemingly random locations.  Once, I saw a Python traceback involving libqtc.sipCallCtor(204,self,args) -> AttributeError: sipThis  before getting the GC error (sorry, I can't paste it in right now).  This appeared to happen when the GUI thread decided to update the screen.  The amount of time things appear to run correctly before crashing seems to be random.

There are no intentional interactions between the usage of my library and the rest of the PyQt application, e.g., the library's methods aren't trying to update the screen.  Can someone please describe for me how to keep two SIP applications running in two threads of the same process from tangling?  Or is the rule of the game that there can be only one thread using SIP generated code?  If so, can I solve this by going to one of the other C/C++ to Python interface packages, e.g., SWIG or Boost?  Can these coexist with SIP?

  Thanks for any help,

More information about the PyQt mailing list