2009-03-26 6 views
4

Je rencontre des problèmes de threading dans mon application pyGTK. Je donne au thread un peu de temps pour terminer sa tâche, s'il y a un problème, je continue tout de même mais avertis l'utilisateur. Cependant, une fois que je continue, ce thread s'arrête jusqu'à ce que gtk.main_quit soit appelé. Cela me déroute.threads séparés dans l'application pygtk

Le code correspondant:

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

Je ressens votre douleur. J'ai été à travers le jeu de threading avec pygtk avant moi! –

Répondre

8

Tout d'abord, ne pas sous-classe threading.Thread, utiliser Thread(target=callable).start().

En second lieu, et probablement la cause de votre bloc apparent est que gtk.main_iteration prend un paramètre block, qui par défaut True, de sorte que votre appel à gtk.main_iteration va bloquer réellement quand il n'y a pas d'événements à itérer sur. Ce qui peut être résolu avec:

gtk.main_iteration(block=False) 

Cependant, il n'y a pas vraiment d'explication pourquoi vous utilisez cette boucle piraté plutôt que de la boucle principale GTK réelle. Si vous exécutez déjà ceci dans une boucle principale, alors je suggérerais que vous faites la mauvaise chose. Je peux développer vos options si vous nous donnez un peu plus de détails et/ou l'exemple complet.

En troisième lieu, et cela ne est venu plus tard: Toujours toujours toujourstoujours assurez-vous que vous avez appelé gtk.gdk.threads_init dans une application pygtk avec des fils. GTK + a des chemins de code différents lors de l'exécution de threads, et il doit savoir pour les utiliser.

J'ai écrit a small article about pygtk and threads qui vous offre une petite abstraction pour ne jamais avoir à vous soucier de ces choses. Ce message contient également un exemple de barre de progression.

+2

De votre page j'ai trouvé que je suis supposé écrire: gtk.gdk.threads_init() que je n'ai jamais fait. Ça fonctionne maintenant. Quelle est la raison pour laquelle je ne devrais pas je sous-classe thread.Thread? Tous les exemples que j'ai regardés le font. – wodemoneke

+0

Je cours dans le mainloop, mais je ne veux pas continuer jusqu'à ce que je sais si le thread va échouer ou non, c'est pourquoi j'ai écrit cette boucle interne. – wodemoneke

+0

Il n'est tout simplement pas nécessaire de le sous-classer. http://stackoverflow.com/questions/660961/overriding-python-threading-thrun/660974#660974 –

Questions connexes