2010-07-07 4 views
7

Я и друг разрабатывают приложение, которое использует Boost :: Python. Я определил интерфейс в C++ (ну чистый виртуальный класс), который был открыт через Boost :: Python для пользователей, которым необходимо наследовать его и создать класс, который приложение использует и использует для некоторого механизма обратного вызова.Проблемы с Boost :: Python и Boost :: Темы

Все, что далеко идет очень хорошо. Теперь обратный вызов функции может занять некоторое время (пользователь может запрограммировать некоторые тяжелые вещи) ... но нам нужно перекрасить окно, поэтому оно не выглядит «застрявшим». Мы хотели использовать Boost :: Thread для этого , За один раз будет выполняться только один обратный вызов (ни один другой поток не будет вызывать python в одно и то же время), поэтому мы думали, что это будет не так много ... поскольку мы не используем потоки внутри python, ни в Код C++, завернутый для python.

Что мы делаем, вызывая PyEval_InitThreads() только после того, как Py_Initialize(), а затем, перед вызовом функции обратного вызова внутри его собственной повышающей нити, мы используем макрос PY_BEGIN_ALLOW_THREADS и, а также макро PY_END_ALLOW_THREADS когда нить закончилась.

Думаю, мне не нужно говорить, что исполнение никогда не достигает второго макроса. Он показывает несколько ошибок каждый раз, когда он запускается ... но t всегда вызывает фактический обратный вызов. Я много гугнул, даже прочитал некоторые документы PEP по темам, но все они говорят о потоковом потоке внутри модуля python (который я не вижу, это просто чистый виртуальный класс) или потоковой передачи внутри python, а не о главном приложение, вызывающее Python из нескольких потоков.

Пожалуйста, помогите, это меня разочаровывало в течение нескольких часов.

Ps. Помогите!

+0

Какие ошибки вы видите? –

+0

Это всегда SIGSEGV. – Fabzter

ответ

1

Python можно вызывать из нескольких потоков серийно, я не думаю, что это проблема. Мне кажется, что ваши ошибки исходят из плохого кода на C++, поскольку вы сказали, что ошибки произошли после PY_BEGIN_ALLOW_THREADS и до PY_END_ALLOW_THREADS.

Если вы знаете, что это не так, можете ли вы опубликовать немного больше своего фактического кода и показать, где именно его ошибка и какие именно ошибки дают?

Смежные вопросы