Frage

Ich habe einige Probleme meine pyGTK Anwendung Threading. Ich gebe dem Thread einige Zeit seine Aufgabe zu erfüllen, wenn es ein Problem, das ich auch weiterhin einfach mal so, aber den Benutzer warnen. Doch sobald ich weiter, stoppt dieses Thema bis gtk.main_quit genannt wird. Dies ist verwirrend mich.

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
War es hilfreich?

Lösung

Zum einen, nicht Unterklasse threading.Thread, Verwendung Thread(target=callable).start().

Zweitens, und wahrscheinlich die Ursache für Ihren scheinbaren Block nimmt, dass gtk.main_iteration einen Parameter block, die standardmäßig auf True, so Ihr Anruf gtk.main_iteration tatsächlich blockieren, wenn es keine Veranstaltungen auf iterieren. Die 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 bereits das Laufen in einer Hauptschleife sind, dann würde ich vorschlagen, dass Sie die falsche Sache tun. Ich kann auf Ihren Möglichkeiten erweitern, wenn Sie uns geben, ein bisschen mehr Detail und / oder das komplette Beispiel.

Drittens, und das kam erst später auf: Immer immer immer immer stellen Sie sicher, gtk.gdk.threads_init in jeder pygtk Anwendung aufgerufen haben mit Gewinden. GTK + verschiedene Codepfade hat, wenn Gewinde ausgeführt werden, und es muss wissen, diese nutzen.

Ich schrieb einen kleinen Artikel über pygtk und Fäden das bietet Ihnen eine kleine Abstraktion, so dass Sie sich niemals über diese Dinge zu kümmern. Das Post enthält auch einen Fortschrittsbalken Beispiel.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top