pygtk и native gtk_main ();смешивание - PullRequest
2 голосов
/ 04 февраля 2011

Я пытаюсь разработать приложение на основе Си, в которое встроены один или несколько интерпретаторов Python.Я использую gtk-вещи в C-частях и логически вызываю gtk_main () в этом.

Интерпретаторы Python создаются в отдельных pthreads с использованием Py_NewInterpreter () и в основном работают вечно (a, тогда как True'цикл добавляется в конец в случае, если сценарий завершается).

Теперь я хотел бы использовать pyGTK в этих сценариях, который, кажется, работает до тех пор, пока не произойдет обратный вызов (сигнал испускается).Вы можете зарегистрировать обработчики сигналов, чтобы они указывали на части в скриптах Python, но похоже, что главный цикл gtk не может правильно направить их, когда они происходят, что приводит к ошибкам в сегменте, как в журнале ниже.

Я предполагаюэто может быть связано с тем, что состояние потока Python не инициализируется правильно, но не точно.Кто-нибудь может понять, что я делаю неправильно или что проверить?

#0  0xb7ecfc9a in PyFrame_New () from /usr/lib/libpython2.5.so.1.0
#1  0xb7f376ed in PyEval_EvalCodeEx () from /usr/lib/libpython2.5.so.1.0
#2  0xb7ed09b6 in ?? () from /usr/lib/libpython2.5.so.1.0
#3  0xb7eae327 in PyObject_Call () from /usr/lib/libpython2.5.so.1.0
#4  0xb7f30f7c in PyEval_CallObjectWithKeywords () from /usr/lib/libpython2.5.so.1.0
#5  0xb7eaeb5c in PyObject_CallObject () from /usr/lib/libpython2.5.so.1.0
#6  0xb424face in ?? () from /usr/lib/pymodules/python2.5/gtk-2.0/gobject/_gobject.so
#7  0xb76e113a in g_closure_invoke () from /usr/lib/libgobject-2.0.so.0
#8  0xb76f761d in ?? () from /usr/lib/libgobject-2.0.so.0
#9  0xb76f8bfc in g_signal_emit_valist () from /usr/lib/libgobject-2.0.so.0
#10 0xb76f9076 in g_signal_emit () from /usr/lib/libgobject-2.0.so.0
#11 0xb7ab3a8a in gtk_button_clicked () from /usr/lib/libgtk-x11-2.0.so.0
#12 0xb7ab5048 in ?? () from /usr/lib/libgtk-x11-2.0.so.0
#13 0xb76eecac in g_cclosure_marshal_VOID__VOID () from /usr/lib/libgobject-2.0.so.0
#14 0xb76df7a9 in ?? () from /usr/lib/libgobject-2.0.so.0
#15 0xb76e113a in g_closure_invoke () from /usr/lib/libgobject-2.0.so.0
#16 0xb76f6eba in ?? () from /usr/lib/libgobject-2.0.so.0
#17 0xb76f8bfc in g_signal_emit_valist () from /usr/lib/libgobject-2.0.so.0
#18 0xb76f9076 in g_signal_emit () from /usr/lib/libgobject-2.0.so.0
#19 0xb7ab3b2a in gtk_button_released () from /usr/lib/libgtk-x11-2.0.so.0
#20 0xb7ab3b73 in ?? () from /usr/lib/libgtk-x11-2.0.so.0
#21 0xb7b70e74 in ?? () from /usr/lib/libgtk-x11-2.0.so.0
#22 0xb76df7a9 in ?? () from /usr/lib/libgobject-2.0.so.0
#23 0xb76e113a in g_closure_invoke () from /usr/lib/libgobject-2.0.so.0
#24 0xb76f7266 in ?? () from /usr/lib/libgobject-2.0.so.0
#25 0xb76f8a7b in g_signal_emit_valist () from /usr/lib/libgobject-2.0.so.0
#26 0xb76f9076 in g_signal_emit () from /usr/lib/libgobject-2.0.so.0
#27 0xb7c9d156 in ?? () from /usr/lib/libgtk-x11-2.0.so.0
#28 0xb7b694cd in gtk_propagate_event () from /usr/lib/libgtk-x11-2.0.so.0
#29 0xb7b6a857 in gtk_main_do_event () from /usr/lib/libgtk-x11-2.0.so.0
#30 0xb79f3dda in ?? () from /usr/lib/libgdk-x11-2.0.so.0
#31 0xb7636305 in g_main_context_dispatch () from /lib/libglib-2.0.so.0
#32 0xb7639fe8 in ?? () from /lib/libglib-2.0.so.0
#33 0xb763a527 in g_main_loop_run () from /lib/libglib-2.0.so.0
#34 0xb7b6ae19 in gtk_main () from /usr/lib/libgtk-x11-2.0.so.0

Ответы [ 2 ]

0 голосов
/ 06 февраля 2011

Это выглядит как довольно длинный стек, а некоторые из вызываемых функций выглядят одинаково. (Например, g_signal_emit вызывается из самого себя через g_closure_invoke.)

Мне кажется, что вы можете вызывать переполнение стека, возможно, испуская сигнал внутри вашего обратного вызова, который обрабатывает сигнал, таким образом бесконечно повторяясь до тех пор, пока вы не исчерпаете пространство стека и не упадете. Это всего лишь предположение, и я мало что знаю о внутренностях GTK + / GLIB, но это то, что пахнет для меня. Я бы положил на это деньги. : -)

Если нет, то, возможно, замыкания GLIB слишком сильно сцеплены (один обратный вызов вызывает другой обратный вызов, который вызывает другой и т. Д. И т. Д., Пока у вас не закончится свободное место.) Возможно, настройка размера стека поможет. (Я не помню наизусть, если есть простой способ сделать это для main(), но если вы создаете новый поток, pthread_attr_setstacksize() может помочь.)

0 голосов
/ 06 февраля 2011

Это ситуация, когда вам лучше создать еще одного интерпретатора Python и выполнить всю работу GTK, отправив фрагменты Python этому специальному вспомогательному интерпретатору GTK.Таким образом, ваш код на C никогда не использует GTK напрямую, и вам нужно беспокоиться только о координации между потоками Python.

...