Salve a tutti, ho del codice che fa alcuni write su una porta seriale. Tra l'uno e l'altro, voglio far passare un poco di tempo. Ma non voglio usare time.sleep o analoghi per non bloccare l'interfaccia (e preferisco evitare di usare thread).
Una soluzione l'ho trovata (uso le glib, ma il principio mi sembra chiaro): class ScrittoreDiSerial(object): def __init__(self): schiavo = self.lavoratore() # Effettua la seguente chiamata ogni 20 millisecondi: glib.timeout_add( 20, schiavo.next ) def lavoratore(self): fai_qualcosa() yield True fai_qualcos_altro() yield True # E posso fare anche: while una_condizione(): ripeti_un_azione() yield True # Infine: yield L'unica cosa scocciante è appena mi si complica un attimo "lavoratore": non posso separare il suo codice in diversi metodi che siano ognuno capace di fare "pause": se uno chiama yield, allora devo istanziarlo, chiamarlo in un loop... è un po' una palla. Per dirne una, in "lavoratore" ho cose tipo # Aspetta al massimo un secondo: for i in range(50): if leggoqualcosadallaseriale(): break yield if nonholettoancoranulladallaseriale(): spara_messaggio_di_errore() E idealmente tutto ciò sarebbe contenuto in una funzione in modo che da "lavoratore" io potessi fare semplicemente self.aspetta(num_secondi) mentre ovviamente non funziona, perché "yield" non si propaga. Avete idee più brillanti su come organizzare il mio codice? Fare dei generatori che si chiamano l'un l'altro è una soluzione che non mi piace... Nel mio caso particolare, una soluzione forse più comoda è utilizzare, per le pause, un (opportuno metodo, con dentro un) loop che chiama gtk.mainiteration() finché non è passato il tempo desiderato. Ma dovrei studiarmi ogni quanto chiamare gtk.mainiteration()... insomma, anche questa è un po' noiosa. grazie Pietro _______________________________________________ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python