[Python] wxpython & thread

Manlio Perillo manlio.perillo a gmail.com
Lun 22 Dic 2014 14:30:01 CET


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
-------------- parte successiva --------------
Un allegato HTML è stato rimosso...
URL: <http://lists.python.it/pipermail/python/attachments/20141222/1911d605/attachment.html>


Maggiori informazioni sulla lista Python