separate Threads in pygtk Anwendung
-
22-08-2019 - |
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
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.