cristian_c [url=http://forum.ubuntu-it.org/viewtopic.php?p=4427202#p4427202][img]http://forum.ubuntu-it.org/images/icons/icona-cita.gif[/img][/url] ha scritto:Ho cercato di ricostruire la catena di esecuzione e ho studiato un altro po' di codice
Nel metodo lock del file olifant.py, è presente:
Codice: Seleziona tutto
self.__device_locker.active_lock_devices() #will disable power button/keyboard/lid and check if power button is pressed
Ora, se apro il file olifantDeviceLock.py, trovo:
Codice: Seleziona tutto
def active_lock_devices(self):
"""
Same of lock_devices but blocks until power button is pressed,
useful to detect pressing: when button is pressed wasButtonPressed
function will return true (power button will still be disabled
untile unlock)
"""
pt = self._PowerThread(self)
pt.start()
il quale mi rimanda alla classe _PowerThread:
Codice: Seleziona tutto
class _PowerThread(threading.Thread):
def __init__(self,powerLock):
threading.Thread.__init__(self)
self.power = powerLock
def run(self):
self.power._thread_run()
ma non mi è chiaro, effettivamente, cosa succede
Immagino tu ti riferisca al thread: eseguendo
pt = self._PowerThread(self) viene eseguita la funzione __init__ dell'oggetto _PowerThread, eseguendo pt.start() il thread diventa effettivamente un thread e viene eseguita la funzione run. Comunque non mi è chiaro perché definisci una classe dentro una classe e perché metti dappertutto il "_" iniziale. Quello dovresti metterlo solo per le funzioni "di servizio", che serviranno solo all'interno dell'oggetto e che a nessuno servirà al di fuori di li (es. un calcolo particolare che è particolare per quell'oggetto).
In ogni caso per convenzione/abitudine non si inseriscono mai undescore nei nomi degli oggetti, che sono sempre parole le cui iniziali sono sempre maiuscole (PowerLock, PowerThread, HBox, FloatLayout, AsyncImage, ecc...) e invece i trattini si usano solo nelle funzioni (on_certain_event, lock_devices, ecc...)
I trattini iniziali, come ho già detto si usano solo in casi particolari: guarda per esempio le funzioni delle liste: troverai roba tipo __delitem__, ecc: tutta roba che non devi usare, dovresti usare invece "remove" o "pop"; il fatto che i trattini siano doppi e anche alla fine rafforzano questo concetto
P.S. Ignora, se vuoi, le mie solite pignolerie
Comunque è chiaro cosa avviene avviando il thread? Tutto quello che deve essere in background lo devi mettere in run; quello che metti in __init__ viene eseguito normalmente quando istanzi il thread. Per capirci, se metti time.sleep(10) in __init__ nel thread o all'inizio di active_lock_devices il programma si blocca in entrambi i casi per 10 secondi, mentre se lo metti in run si blocca solo il thread, e l'eventuale codice che metti dopo pt.start() viene eseguito anche se il thread sta aspettando. Chiaro?