[Python] wxpython & thread

Riccardo Brazzale riccardo.brazzale a gmail.com
Lun 22 Dic 2014 18:15:46 CET


Grazie Manlio,

Mi sono chiesto: chi ama infinitamente i python thread nella mailing list?
Quella persona sarà certamente quella che verrà a darmi una mano.... [?] :-)!

Ti ringrazio!

Ti confesso che non ci capisco molto ma ci provo.

All'interno del run reale non c'e' altro che un ciclo for di invio mail
(qualche centinaio).

Fino ad ora ero riuscito a mettere in piedi qualcosa che funziona bene ma
blocca ovviamente l'interfaccia.

Adattando il codice che ho postato, tutto va molto meglio tranne, ripeto,
quando tento di fermare il processo di invio,

Devo mettermi a studiare oltre, mi pare non ci siano alternative.

Vedo se riesco ad adattare ulteriormente sfruttando, come dici tu, una
queue.

Grazie comunque.




Il giorno 22 dicembre 2014 14:30, Manlio Perillo <manlio.perillo a gmail.com>
ha scritto:

> On Mon, Dec 22, 2014 at 12:09 PM, Riccardo Brazzale <
> riccardo.brazzale a gmail.com> wrote:
>
>> Ciao a tutti,
>>
>> sto cercando di capire come gestire un thread avviandolo con wxpython.
>>
>
> Buona fortuna!
>
>
>> Ho trovato questo:
>>
>> import time
>> import wx
>>
>> from threading import Thread
>>
>>
> > [...]
>
>>
>>
>> #----------------------------------------------------------------------
>>     def run(self):
>>         """Run Worker Thread."""
>>         # This is the code executing in the new thread.
>>         for i in range(6):
>>             time.sleep(10)
>>             amtOfTime = (i + 1) * 10
>>             wx.PostEvent(self.wxObject, ResultEvent(amtOfTime))
>>         time.sleep(5)
>>
>
> Ovviamente se fai una sleep blocchi tutto il thread.
> Non c'è modo (sano) di terminare un thread in questo stato, come con i
> processi.
> Quello che devi fare è mandare degli eventi al thread, e gestirli nella
> funzione run,
> ma non ho idea di come si faccia in Wx.
>
> Dovresti postare la tua funzione run reale, per capire come organizzare il
> codice.
> Ad esempio potresti usare una threading.Queue.
> Passa la queue allo stesso modo in cui passi wxObject.
>
> > [...]
>
>
>> Tuttavia, come faccio a terminare il thread avviato una volta che clicco
>> la x di chiusura o che metto lì un pulsante "chiudi"?
>>
>>
> Come detto, devi notificare in qualche modo il thread.
> A meno che wx non abbia qualcosa di molto conveniente disponibile, usa
> una queue.
>
>
>> Tenete presente che il tutto è sotto windows.
>>
>> 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.
>>
>
> Quando usi i thread è difficile capire cosa non va.
> Prova a loggare i vari stati dell'applicazione, per vedere se
> effettivamente il main thread termina
> prima del worker thread.
>
> Un bug del codice sicuramente è quello di non fare il .join del thread.
> Per evitare di bloccare l'interfaccia, passa un timeout basso e poi
> richiamalo
> ad intervalli regolari usando un timer.
> Esci dall'applicazione solo quando tutti i thread sono terminati.
>
> > [...]
>
> Ciao  Manlio
>
> _______________________________________________
> Python mailing list
> Python a lists.python.it
> http://lists.python.it/mailman/listinfo/python
>
>


-- 
Riccardo Brazzale
-------------- parte successiva --------------
Un allegato HTML è stato rimosso...
URL: <http://lists.python.it/pipermail/python/attachments/20141222/732442cd/attachment-0001.html>
-------------- parte successiva --------------
Un allegato non testuale è stato rimosso....
Nome:        338.gif
Tipo:        image/gif
Dimensione:  541 bytes
Descrizione: non disponibile
URL:         <http://lists.python.it/pipermail/python/attachments/20141222/732442cd/attachment-0001.gif>


Maggiori informazioni sulla lista Python