2013-06-15 3 views
0

У меня есть приложение pygtk, которое запускается, как только открывается мой скрипт python. Наряду с gtk.main) У меня есть поток, который запускается (в начале скрипта, который обновляет gtk.TextView() экземпляра:Как запустить отдельные потоки в pygtk

def listen(self): 
    while True: 
     print "refreshing" 
     data = self.socket.recv(buffer_size) 
     if data: 
      self.txtBuffer.insert(self.txtBuffer.get_end_iter(), data + "\n") 
      print data 

thread.start_new_thread(self.listen,()) 
self.set_up_gui() # gtk.main() 

Однако, когда я запускаю программу, графический интерфейс открывает, но текст «освежающий» не печатается, и никакие данные не печатаются при отправке в сокет. Я попытался использовать glib.add_idle() для потоковой передачи этой программы, однако это работает только при отдельном потоке, когда gui неактивен (что редко). Спасибо!

ответ

2

Вы получаете доступ к текстовому буферу из другого потока без какой-либо синхронизации, которая не поддерживается. Чтобы исправить это, замените self.txtBuffer.insert(...) на gobject.idle_add(lambda: self.txtBuffer.insert(...)). Это говорит о том, что поток GUI обновляет текстовый буфер на следующей итерации основного цикла, что гарантированно работает без явной синхронизации.

Вы должны убедиться, что поток GUI не заблокирован, то есть он работает gtk.main() и обрабатывает только обновления графического интерфейса, такие как приведенные выше textBuffer.insert. Долгосрочные/блокирующие задачи должны быть делегированы другим потокам или процессам, так как ваш код уже пытается сделать. Когда это будет реализовано, обновления GUI появятся мгновенно.

Дополнительную информацию о PyGTK и резьбе см. В разделе this answer.

+0

GUI работает отлично, однако данные по-прежнему не обновляются. Данные также не принимаются, потому что ничего не печатается данными печати Редактировать: Мне кажется, что графический интерфейс просто не позволяет потоку запускаться вообще – Lachie

+0

Исправлено это, просто нужно было реализовать ваше решение правильно, большое спасибо! – Lachie

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