<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Mon, Dec 22, 2014 at 12:09 PM, Riccardo Brazzale <span dir="ltr"><<a href="mailto:riccardo.brazzale@gmail.com" target="_blank">riccardo.brazzale@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Ciao a tutti,<div><br></div><div>sto cercando di capire come gestire un thread avviandolo con wxpython.</div></div></blockquote><div><br></div><div>Buona fortuna!</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div>Ho trovato questo:</div><div><br></div><div><div>import time</div><div>import wx</div><div> </div><div>from threading import Thread</div><div> </div></div></div></blockquote><div>> [...] </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div><div> </div><div>    #----------------------------------------------------------------------</div><div>    def run(self):</div><div>        """Run Worker Thread."""</div><div>        # This is the code executing in the new thread.</div><div>        for i in range(6):</div><div>            time.sleep(10)</div><div>            amtOfTime = (i + 1) * 10</div><div>            wx.PostEvent(self.wxObject, ResultEvent(amtOfTime))</div><div>        time.sleep(5)</div></div></div></blockquote><div><br></div><div>Ovviamente se fai una sleep blocchi tutto il thread.</div><div>Non c'è modo (sano) di terminare un thread in questo stato, come con i processi.</div><div>Quello che devi fare è mandare degli eventi al thread, e gestirli nella funzione run,</div><div>ma non ho idea di come si faccia in Wx.</div><div><br></div><div>Dovresti postare la tua funzione run reale, per capire come organizzare il codice.</div><div>Ad esempio potresti usare una threading.Queue.</div><div>Passa la queue allo stesso modo in cui passi wxObject.</div><div><br></div><div>> [...]</div><div> <br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div><div></div><div>Tuttavia, come faccio a terminare il thread avviato una volta che clicco la x di chiusura o che metto lì un pulsante "chiudi"?</div><div><br></div></div></div></blockquote><div><br></div><div>Come detto, devi notificare in qualche modo il thread.</div><div>A meno che wx non abbia qualcosa di molto conveniente disponibile, usa</div><div>una queue.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div><div></div><div>Tenete presente che il tutto è sotto windows.</div><div><br></div><div>Quello che succede (anche se non sempre) è che chiudendo, il programma va in crash probabilmente proprio per il fatto che il thread rimane vivo e tenta di restituire qualcosa che non è più possibile restituire.</div></div></div></blockquote><div><br></div><div>Quando usi i thread è difficile capire cosa non va.</div><div>Prova a loggare i vari stati dell'applicazione, per vedere se effettivamente il main thread termina</div><div>prima del worker thread.</div><div><br></div><div>Un bug del codice sicuramente è quello di non fare il .join del thread.</div><div>Per evitare di bloccare l'interfaccia, passa un timeout basso e poi richiamalo</div><div>ad intervalli regolari usando un timer.</div><div>Esci dall'applicazione solo quando tutti i thread sono terminati.</div><div><br></div><div>> [...]</div><div><br></div><div>Ciao  Manlio</div></div></div></div>