2010-07-07 19 views
7

Un amigo y yo estamos desarrollando una aplicación que usa Boost :: Python. He definido una interfaz en C++ (y una clase virtual pura), expuesta a través de Boost :: Python a los usuarios, que tienen que heredar de ella y crear una clase, que la aplicación toma y usa para algún mecanismo de devolución de llamada.Problemas con Boost :: Python y Boost :: Threads

Todo lo que va muy bien. Ahora, la devolución de llamada de la función puede llevar algo de tiempo (el usuario puede haber programado algunas cosas pesadas) ... pero tenemos que volver a pintar la ventana, para que no parezca "atascada". Queríamos usar Boost :: Thread para esto . Solo se ejecutará una devolución de llamada a la vez (ningún otro subproceso llamará a Python al mismo tiempo), así que pensamos que no sería tan bueno ... ya que no usamos hilos dentro de Python, ni en el C++ código envuelto para Python.

lo que hacemos es llamar PyEval_InitThreads() justo después de Py_Initialize() y, a continuación, antes de llamar a la devolución de llamada función dentro de su propio hilo de impulso, se utiliza el PY_BEGIN_ALLOW_THREADS macro y, y los PY_END_ALLOW_THREADS macro cuando el hilo ha terminado.

Creo que no necesito decir que la ejecución nunca llega a la segunda macro. Muestra varios errores cada vez que se ejecuta ... pero t siempre está llamando a la devolución de llamada real. He buscado mucho en Google, incluso he leído algunos de los documentos PEP con respecto a los hilos, pero todos hablan de enhebrar dentro del módulo python (que no creo que sea solo una clase virtual pura expuesta) o de enrutar dentro de python, no sobre el principal aplicación que llama a Python desde varios hilos.

Por favor ayuda, esto me ha estado frustrando por varias horas.

Ps. ¡ayuda!

+0

¿Qué errores estás viendo? –

+0

Siempre es un SIGSEGV. – Fabzter

Respuesta

1

Se puede llamar a Python desde varios hilos en serie, no creo que sea un problema. Me parece que tus errores provienen del código C++ incorrecto, como dijiste que los errores ocurrieron después de PY_BEGIN_ALLOW_THREADS y antes de PY_END_ALLOW_THREADS.

Si sabes que eso no es cierto, ¿puedes publicar un poco más de tu código real y mostrar exactamente dónde está cometiendo el error y qué errores exactamente?

Cuestiones relacionadas