2010-07-07 4 views
7

Ich und ein Freund entwickeln eine Anwendung, die Boost :: Python verwendet. Ich habe eine Schnittstelle in C++ (nun eine reine virtuelle Klasse) definiert, die über Boost :: Python den Benutzern zugänglich gemacht wird, die daraus erben müssen und eine Klasse erstellen müssen, die die Anwendung für einen Callback-Mechanismus verwendet und verwendet.Probleme in Bezug auf Boost :: Python und Boost :: Threads

Alles so weit geht ziemlich gut. Nun kann der Funktionsrückruf einige Zeit dauern (der Benutzer hat vielleicht ein paar schwere Sachen programmiert) ... aber wir müssen das Fenster neu streichen, damit es nicht "hängenbleibt". Wir wollten dafür Boost :: Thread verwenden . Es wird immer nur ein Callback ausgeführt (keine anderen Threads rufen python zur gleichen Zeit auf), also dachten wir, es wäre nicht so toll ... da wir weder Threads innerhalb von Python noch in der C++ - Code für Python umschlossen.

Was wir tun, ist PyEval_InitThreads() aufgerufen wird kurz nach Py_Initialize(), dann, bevor Sie die Callback-Funktion innerhalb seiner eigenen Boost-Thread aufrufen, verwenden wir die Makro PY_BEGIN_ALLOW_THREADS und und das Makro PY_END_ALLOW_THREADS, wenn der Thread beendet ist.

Ich denke, ich brauche nicht zu sagen, die Ausführung erreicht nie das zweite Makro. Es zeigt mehrere Fehler jedes Mal wenn es läuft ... aber es ist immer während des Callbacks. Ich habe viel gegoogelt, sogar einige der PEP-Dokumente zu Threads gelesen, aber sie alle sprechen über Threading innerhalb des Python-Moduls (was ich nicht weiß, es ist nur eine reine virtuelle Klasse) oder Threading innerhalb von Python, nicht über das Main Anwendung, die Python aus mehreren Threads aufruft.

Bitte helfen, das hat mich für mehrere Stunden frustriert.

Ps. Hilfe!

+0

Welche Fehler sehen Sie? –

+0

Es ist immer ein SIGSEGV. – Fabzter

Antwort

1

Python kann seriell aus mehreren Threads aufgerufen werden, ich glaube nicht, dass das ein Problem ist. Es klingt für mich, als ob Ihre Fehler nur von schlechtem C++ - Code kommen, wie Sie sagten, dass die Fehler nach PY_BEGIN_ALLOW_THREADS und vor PY_END_ALLOW_THREADS aufgetreten sind.

Wenn Sie wissen, dass das nicht stimmt, können Sie ein wenig mehr von Ihrem tatsächlichen Code und zeigen genau, wo es Fehler gibt und welche Fehler gibt es genau?