<div dir="ltr"><div><div><div><div>Grazie Manlio,<br><br></div>Mi sono chiesto: chi ama infinitamente i python thread nella mailing list?<br>Quella persona sarà certamente quella che verrà a darmi una mano.... <img goomoji="338" style="margin: 0px 0.2ex; vertical-align: middle;" src="cid:338@goomoji.gmail"> :-)!<br><br></div>Ti ringrazio!<br><br></div><div>Ti confesso che non ci capisco molto ma ci provo.<br><br></div><div>All'interno del run reale non c'e' altro che un ciclo for di invio mail (qualche centinaio).<br><br></div><div>Fino ad ora ero riuscito a mettere in piedi qualcosa che funziona bene ma blocca ovviamente l'interfaccia.<br><br></div><div>Adattando il codice che ho postato, tutto va molto meglio tranne, ripeto, quando tento di fermare il processo di invio,<br><br></div><div>Devo mettermi a studiare oltre, mi pare non ci siano alternative.<br><br></div><div>Vedo se riesco ad adattare ulteriormente sfruttando, come dici tu, una queue.<br><br></div><div>Grazie comunque.<br></div><div><br></div><br></div><br></div><div class="gmail_extra"><br><div class="gmail_quote">Il giorno 22 dicembre 2014 14:30, Manlio Perillo <span dir="ltr"><<a href="mailto:manlio.perillo@gmail.com" target="_blank">manlio.perillo@gmail.com</a>></span> ha scritto:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><span class="">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></span><div>Buona fortuna!</div><span class=""><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></span><div>> [...] </div><span class=""><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></span><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><span class=""><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></span><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><span class=""><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></span><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>
<br>_______________________________________________<br>
Python mailing list<br>
<a href="mailto:Python@lists.python.it">Python@lists.python.it</a><br>
<a href="http://lists.python.it/mailman/listinfo/python" target="_blank">http://lists.python.it/mailman/listinfo/python</a><br>
<br></blockquote></div><br><br clear="all"><br>-- <br><div class="gmail_signature"><div dir="ltr"><div><div dir="ltr"><div dir="ltr"><font face="monospace">Riccardo Brazzale</font></div><div dir="ltr"><br></div></div></div></div></div>
</div>