[PyKDE] embedding PyQt in a c++ app

Phil Thompson phil at riverbankcomputing.co.uk
Thu Jul 29 17:46:00 BST 2004


You don't say which version of SIP you are using.

With SIP 3.x PyQt will lock the GIL when it needs to and unlock it when it has 
finished. The initial state of the GIL must be as PyQt is expecting - if you 
are embedding PyQt this is easy to get wrong. In other words, it uses the 
older GIL API.

With SIP 4.x PyQt will lock the GIL when it needs to and it isn't already 
locked. When it has finished it restores the lock to its previous state. The 
initial state of the GIL doesn't matter. In other words, it uses the newer 
GIL API.

You are using the older, difficult to use, API. Try the newer one and SIP 4.x.

Phil

On Thursday 29 July 2004 4:21 pm, Christoph Wiedemann wrote:
> Hello,
>
> i have problems to embed PyQt in a c++ application. Since the application
> uses threads and multiple python interpreters, i must ensure that the
> correct thread state is set and the GIL is locked, whenever the python API
> is used. I do that with the
>
>   PyEval_RestoreThread(threadState);
>
> and
>
>   PyEval_SaveThread();
>
> methods. This works fine, as long as i don't use widgets created with PyQt,
> because there are many "callbacks" (virtual methods), e.g. mousePressEvent,
> which are called directly from PyQt.
>
> Is there any way to force PyQt to acquire the GIL before those virtual
> methods are called?
>
> Hmm, this wouldn't solve the issue with multiple interpreters; each
> interpreter has its own thread state, which must be restored before using
> the API.
>
> Maybe someone on this list has some ideas how to cope with this situation ?
>
> Thanks,
> Christoph
>
> _______________________________________________
> PyKDE mailing list    PyKDE at mats.imk.fraunhofer.de
> http://mats.imk.fraunhofer.de/mailman/listinfo/pykde




More information about the PyQt mailing list