2013-06-15 3 views
0

python 스크립트를 열 자마자 실행되는 pygtk 응용 프로그램이 있습니다. 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() 

는 그러나 GUI가 열립니다, "상쾌하게하는"텍스트는 인쇄되지 않으며 소켓으로 보낼 때 어떤 데이터도 인쇄되지 않습니다. glib.add_idle()을 사용하여이 프로그램을 스레드하려고 시도했지만 gui가 유휴 상태 일 때만 별도의 스레드를 실행합니다 (드문 경우 임). 고맙습니다!

답변

2

지원되지 않는 동기화없이 다른 스레드에서 텍스트 버퍼에 액세스하고 있습니다. 이를 수정하려면 self.txtBuffer.insert(...)gobject.idle_add(lambda: self.txtBuffer.insert(...))으로 대체하십시오. 이것은 명시 적 동기화없이 작동하도록 보장되는 다음 메인 루프 반복에서 텍스트 버퍼를 업데이트하도록 GUI 스레드에 지시합니다.

GUI 스레드가 차단되지 않아야합니다. 즉, gtk.main()을 실행 중이고 위의 textBuffer.insert과 같은 GUI 업데이트 만 처리해야합니다. 장기 실행/차단 작업은 코드에서 이미 시도한 것처럼 다른 스레드 나 프로세스에 위임되어야합니다. 이것이 구현되면 GUI 업데이트가 즉시 발생하는 것으로 보입니다.

PyGTK 및 스레딩에 대한 자세한 내용은 this answer을 참조하십시오.

+0

GUI가 완벽하게 실행되지만 데이터가 아직 새로 고쳐지지 않습니다. 아무 것도 인쇄 데이터로 인쇄되지 않기 때문에 데이터가 수신되지 않습니다. 편집 : GUI가 스레드가 전혀 실행되지 않도록하는 것 같습니다. – Lachie

+0

해결책을 올바르게 구현해야했지만, 고마워요! – Lachie

관련 문제