Domanda

Sto avendo alcuni problemi di threading mia applicazione pyGTK. Io do il filo del tempo per completare il suo compito, se c'è un problema che solo continuare ma comunque avvertire l'utente. Tuttavia, una volta io continuo, questa discussione si ferma fino a quando gtk.main_quit viene chiamato. Questo mi è fonte di confusione.

Il codice in questione:

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
È stato utile?

Soluzione

In primo luogo, non sottoclasse threading.Thread, uso Thread(target=callable).start().

In secondo luogo, e probabilmente la causa del blocco evidente è che gtk.main_iteration prende un block parametro, che per default è True, quindi la chiamata al gtk.main_iteration effettivamente bloccare quando non ci sono eventi a iterare su. Che può essere risolto con:

gtk.main_iteration(block=False)

Tuttavia, non v'è alcuna spiegazione reale perché si può usare questo ciclo hacked fino piuttosto che il ciclo principale reale gtk. Se si esegue già presente all'interno di un ciclo principale, poi vorrei suggerire che si sta facendo la cosa sbagliata. Posso ampliare le opzioni se ci danno un po 'più in dettaglio e / o l'esempio completo.

In terzo luogo, e questo è venuto solo in un secondo momento: Sempre sempre sempre sempre assicurarsi di aver chiamato gtk.gdk.threads_init in qualsiasi applicazione pygtk con fili. GTK + ha percorsi di codice differenti durante l'esecuzione filettata, e ha bisogno di sapere per utilizzare questi.

un piccolo articolo su pygtk e discussioni che vi offre un piccolo astrazione in modo da non dovete preoccuparvi di queste cose. Questo messaggio include anche un esempio di barra di avanzamento.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top