2010-07-07 5 views
7

Moi et un ami développons une application qui utilise Boost :: Python. J'ai défini une interface en C++ (bien une pure classe virtuelle), exposée par Boost :: Python aux utilisateurs, qui doivent en hériter et créer une classe, que l'application prend et utilise pour un mécanisme de rappel.Problèmes concernant Boost :: Python et Boost :: Threads

Tout va si bien. Maintenant, le rappel de la fonction peut prendre un certain temps (l'utilisateur peut avoir programmé des trucs lourds) ... mais nous devons repeindre la fenêtre, donc ça ne semble pas "coincé". Nous voulions utiliser Boost :: Thread pour cela . Un seul rappel sera exécuté à la fois (aucun autre thread n'appellera Python en même temps), donc nous avons pensé que ce ne serait pas une grande affaire ... puisque nous n'utilisons pas de threads dans python, ni dans le Code C++ encapsulé pour python.

Ce que nous faisons est d'appeler PyEval_InitThreads() juste après Py_Initialize(), puis, avant d'appeler la fonction de rappel de fonction à l'intérieur de son propre fil de boost, nous utilisons les PY_BEGIN_ALLOW_THREADS macro et, et les PY_END_ALLOW_THREADS macro lorsque le fil est terminé.

Je pense que je n'ai pas besoin de dire que l'exécution n'atteint jamais la deuxième macro. Il montre plusieurs erreurs à chaque fois qu'il s'exécute ... mais il est toujours en appelant le rappel réel. J'ai beaucoup googlé, j'ai même lu quelques-uns des docs PEP concernant les threads, mais ils parlent tous de threading dans le module python (que je ne trouve pas juste une pure classe virtuelle) ou de threading dans python, pas sur le principal application appelant Python à partir de plusieurs threads.

S'il vous plaît aider, cela m'a frustré pendant plusieurs heures.

Ps. Aidez-moi!

+0

Quelles erreurs voyez-vous? –

+0

C'est toujours un SIGSEGV. – Fabzter

Répondre

1

Python peut être appelé à partir de plusieurs threads en série, je ne pense pas que ce soit un problème. J'ai l'impression que vos erreurs viennent du mauvais code C++, comme vous l'avez dit, les erreurs se sont produites après PY_BEGIN_ALLOW_THREADS et avant PY_END_ALLOW_THREADS.

Si vous savez que ce n'est pas vrai, pouvez-vous poster un peu plus de votre code actuel et montrer exactement où ses erreurs et exactement quelles erreurs il donne?

Questions connexes