2009-03-26 8 views
4

내 pyGTK 응용 프로그램을 스레딩하는 데 문제가 있습니다. 스레드에게 작업을 완료 할 시간을줍니다. 문제가 발생하면 계속 진행하지만 사용자에게 경고합니다. 그러나 일단 계속되면,이 스레드는 gtk.main_quit가 호출 될 때까지 멈춘다. 이것은 나를 혼란스럽게합니다.pygtk 응용 프로그램의 개별 스레드

관련 코드 :

class MTP_Connection(threading.Thread): 
    def __init__(self, HOME_DIR, username): 
     self.filename = HOME_DIR + "mtp-dump_" + username 
     threading.Thread.__init__(self) 

    def run(self): 
     #test run 
     for i in range(1, 10): 
      time.sleep(1) 
      print i 

..........................

첫째
start_time = time.time() 
conn = MTP_Connection(self.HOME_DIR, self.username) 
conn.start() 
progress_bar = ProgressBar(self.tree.get_widget("progressbar"), 
          update_speed=100, pulse_mode=True) 
while conn.isAlive(): 
    while gtk.events_pending(): 
     gtk.main_iteration() 
    if time.time() - start_time > 5: 
     self.write_info("problems closing connection.") 
     break 
#after this the program continues normally, but my conn thread stops 
+0

나는 당신의 고통을 느낍니다. 나는 나 자신의 앞에 pygtk를 가진 실을 꿰는 게임을 통해이었다! –

답변

8

, 서브 클래스를 threading.Thread으로 지정하지 않으려면 Thread(target=callable).start()을 사용하십시오.

둘째, 아마도 당신의 명백한 블록의 원인은 gtk.main_iteration가 반복하는 이벤트가없는 경우 너무 gtk.main_iteration에 전화가 실제로 차단, 매개 변수 block, True 기본값을 취한다는 것입니다. 어느으로 해결할 수 있습니다

gtk.main_iteration(block=False) 

그러나, 당신은 실제 GTK 메인 루프 대신이 최대 해킹 루프를 사용하는 이유 실제 설명이 없습니다. 만약 당신이 이미 메인 루프 내에서 이것을 실행한다면, 당신이 틀린 일을하고 있다고 제안 할 것입니다. 좀 더 자세한 내용이나 전체 예제를 제공하면 옵션을 확장 할 수 있습니다.

셋째, 이것은 단지 나중에 와서 : 항상 항상 항상항상 당신이 스레드 어떤 pygtk 응용 프로그램에서 gtk.gdk.threads_init을 확인 불렀다합니다. GTK +는 threaded를 실행할 때 서로 다른 코드 경로를 가지며, 이들을 사용하려면 알아야합니다.

나는 작은 추상화를 제공하므로 이러한 것들에 대해 걱정할 필요가 없습니다. a small article about pygtk and threads을 작성했습니다. 해당 게시물에는 진행률 막대 예제도 포함됩니다.

+2

귀하의 페이지에서 나는 다음과 같이 써야만한다는 것을 발견했습니다 : gtk.gdk.threads_init(). 이제 작동합니다. 스레딩을 하위 클래스 화해서는 안되는 이유는 무엇입니까? 스레드? 내가 보았던 모든 예들이 이것을한다. – wodemoneke

+0

mainloop에서 실행 중이지만 스레드가 실패 할 것인지 알기 전까지 계속 진행하고 싶지 않습니다. 따라서이 내부 루프를 작성한 것입니다. – wodemoneke

+0

하위 클래스를 만들 필요가 없습니다. http://stackoverflow.com/questions/660961/overriding-python-threading-thread-run/660974#660974 –

관련 문제