среда, 12 ноября 2008 г.

PyGTK и threading

Столкнулся сегодня с проблемой. У нас есть программа на PyGTK работающая под Windows. Она просто морда к БД и файловому архиву. Задача стоит достаточно тривиально - грузить файлы в фоне (они могут быть по много-много мегабайт). Делается так-же "тривиально" - поток на основе threading.Thread. Но обнаружилась засада - в фоне ничего не качало. Только при выполнении join() делалась нуждная работа.

В результате я пытался делать сложную магию и копал гугл. В итоге обнаружилось, что проблема в gtk. Оно как-то хитрым образом работает с потоками, потому все вызовы gtk надо оборачивать в gtk.threads_enter() и в gtk.threads_leave(). А в начале вызывать gtk.gdk.threads_init().

Теперь код должен выглядеть примерно так:

gtk.gdk.threads_init()
create_window()
gtk.gdk.threads_enter()
gtk.main()
gtk.gdk.threads_leave()

Вот такая вот ерунда.

2 комментария:

Evgen комментирует...

Спасибо!!!
я в гугле провел меньше времени благодаря данному посту ;)

Evgen комментирует...

эть… возникла проблема с завершением приложения - нашел ответ тут