Question

Je vais avoir quelques problèmes de filetage ma demande pygtk. Je donne le fil du temps pour achever sa tâche, s'il y a un problème que je viens de continuer de toute façon, mais avertir l'utilisateur. Cependant, une fois que je continue, ce fil jusqu'à ce que cesse gtk.main_quit est appelé. Cela me prêter à confusion.

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
Était-ce utile?

La solution

Tout d'abord, ne pas sous-classe threading.Thread, utilisez 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 bloque 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 utilisez déjà ce dans une boucle principale, alors je suggère que vous faites quelque chose de mal. 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 toujours toujours assurez-vous que vous avez appelé gtk.gdk.threads_init dans une application pygtk avec des fils. GTK + a différents chemins de code lors de l'exécution filetée, et il a besoin de savoir utiliser ces derniers.

J'ai écrit un petit article sur pygtk et fils qui vous offre une petite abstraction si vous n'avez jamais à vous soucier de ces choses. Ce poste comprend également un exemple de barre de progression.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top