2009-03-26 10 views
4

Ich habe einige Probleme Threading meine pyGTK-Anwendung. Ich gebe dem Thread einige Zeit, um seine Aufgabe zu beenden, wenn es ein Problem gibt, fahre ich einfach fort, aber warne den Benutzer. Sobald ich jedoch fortfahre, stoppt dieser Thread, bis gtk.main_quit aufgerufen wird. Das verwirrt mich.separate Threads in pygtk Anwendung

Der entsprechende Code:

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

Ich fühle deinen Schmerz. Ich habe das Threading-Spiel mit Pygtk vor mir selbst gemacht! –

Antwort

8

Erstens Unterklasse threading.Thread nicht verwenden, Thread(target=callable).start() verwenden.

Zweitens, und wahrscheinlich die Ursache für Ihren scheinbaren Block ist, dass gtk.main_iteration einen Parameter block, der standardmäßig auf True, so Ihr Anruf gtk.main_iteration tatsächlich blockieren nimmt, wenn es keine Veranstaltungen auf iterieren. Welche mit gelöst werden kann:

gtk.main_iteration(block=False) 

Allerdings gibt es keine wirkliche Erklärung, warum Sie diese gehackt Schleife nicht die tatsächlichen gtk Hauptschleife verwenden würden. Wenn Sie dies bereits in einer Hauptschleife ausführen, würde ich vorschlagen, dass Sie das Falsche tun. Ich kann Ihre Optionen erweitern, wenn Sie uns ein bisschen mehr Details und/oder das vollständige Beispiel geben.

Drittens, und das kam erst später auf: Immer immer immerimmer stellen Sie sicher, Sie haben gtk.gdk.threads_init in jeder pygtk Anwendung mit Threads aufgerufen. GTK + hat beim Ausführen von Threads unterschiedliche Codepfade und muss diese verwenden können.

Ich schrieb a small article about pygtk and threads, die Ihnen eine kleine Abstraktion bietet, so dass Sie sich nie um diese Dinge kümmern müssen. Dieser Beitrag enthält auch ein Beispiel für einen Fortschrittsbalken.

+2

Von Ihrer Seite habe ich festgestellt, dass ich schreiben soll: gtk.gdk.threads_init() was ich nie getan habe. Es funktioniert jetzt. Was ist der Grund, warum ich threading.Thread nicht ableiten sollte? Alle Beispiele, die ich betrachtete, tun das. – wodemoneke

+0

Ich laufe in der Hauptschleife, aber ich möchte nicht weitermachen, bis ich weiß, ob der Thread scheitern wird oder nicht, weshalb ich diese innere Schleife geschrieben habe. – wodemoneke

+0

Es besteht keine Notwendigkeit, eine Unterklasse zu erstellen. http://stackoverflow.com/questions/660961/overriding-python-threading-thread-run/660974#660974 –