2009-11-25 2 views
6

Я пишу программу каркасом с использованием pygtk. Основная программа делает следующие вещи:Python, thread and gobject

  1. Создать сторожевую нить контролировать некоторый ресурс
  2. Создание клиента для получения данных из сокета
  3. вызова gobject.Mainloop()

но мне кажется, после моей программы войдите в Mainloop, контрольная цепочка также не будет работать.

Моим обходным путем является использование gobject.timeout_add для запуска монитора.

Но почему создание другого потока не работает?

Вот мой код:

import gobject 
import time 
from threading import Thread 

class MonitorThread(Thread): 

    def __init__(self): 
     Thread.__init__(self) 

    def run(self): 
     print "Watchdog running..." 
     time.sleep(10) 

def main(): 

    mainloop = gobject.MainLoop(is_running=True) 

    def quit(): 
     mainloop.quit() 

    def sigterm_cb(): 
     gobject.idle_add(quit) 


    t = MonitorThread() 
    t.start() 

    print "Enter mainloop..." 

    while mainloop.is_running(): 
     try: 
      mainloop.run() 
     except KeyboardInterrupt: 
      quit() 

if __name__ == '__main__': 

    main() 

Выход программы только "сторожевого работает ... Введите MainLoop ..", то ничего. Кажется, что нить не запускается после входа в mainloop.

+1

Что еще вы ожидаете? С приведенным выше кодом я ожидаю, что эти две вещи будут напечатаны один раз. – u0b34a0f6ae

ответ

9

Можете ли вы разместить код? Возможно, у вас есть проблемы с Global Interpreter Lock.

Your problem solved by someone else :). Я мог бы скопировать-вставить статью здесь, но вкратце c-threads gtk c-threads столкнулся с потоками Python. Вам нужно отключить c-потоки, вызвав gobject.threads_init(), и все должно быть в порядке.

+0

Спасибо, я добавляю фрагмент кода, какой-либо ошибки с этим кодом? –

+0

Получил это. Спасибо за информацию. –

+2

Я рад, что вы добавили короткий ответ в ответ, поскольку ссылка теперь мертва. – vidstige

2

Вы не смогли инициализировать кодовые пути на основе потоков в gtk.

Вы должны помнить две вещи, когда с использованием нитей с PyGTK:

  1. GTK Нити должны быть инициализированы с gtk.gdk.threads_init:

От http://unpythonic.blogspot.com/2007/08/using-threads-in-pygtk.html, авторские права полностью сохраняются автор. Это уведомление об авторских правах не должно быть удалено.

Вы можете думать о glib/gobject вместо pygtk, это то же самое.

+0

Спасибо, я оставляю новые в GTK. Информация помогает. –