[Python] Gestione del tempo.

Manlio Perillo manlio.perillo a gmail.com
Dom 29 Dic 2013 19:27:30 CET


On 28/12/2013 15:17, Gabriele Battaglia wrote:
> [...]
>> Ci sono molte solutioni:
>>
>> 1) SIGALARM su sistemi UNIX
>> 2) ciclo su select con timeout, e aggiorni il tempo con time.clock
>> 3) usi il timer messo a disposizione dal sistema operativo
>> 4) usi il timer messo a disposizione dal tuo framework preferito
>>
> GB: interessante la 2, devo approfondire studiando select perché non ho
 > idea di cosa sia e cosa faccia.
 > Ho deciso di usare la 3.

Al posto di select puoi fare qualcosa tipo sleep(0.1)

> - userò il numero di secondi trascorso dall’avvio dell’orologi e fornito da time.time()

Attenzione che time.time non è completamente affidabile, perchè l'orario 
del sistema potrebbe venire aggiornato, sia durante il passaggio 
da/verso all'ora legale, sia per sincronizzare l'orario se il sistema 
usa il protocollo NTP.

> Affiderò ad un thread secondario il compito di aggiornare gli orologi
 > ogni 0.3 secondi
> e di avvertire l’utente se uno dei 2 counters è arrivato a 00:00:00.
> Al thread primario invece, affiderò il compito di ricevere i comandi
 > dall’utente per mezzo dell’immissione di stringhe di 2 caratteri,
 > lette da raw_input.

Su sistemi UNIX non hai bisogno di 2 thread separati.  Ti basta usare 
select, che ritorna nei due casi:

1) il timeout specificato è trascorso
2) l'utente ha immesso dei dati tramite stdin

La fregatura è che sul solito Windows (che è diversamente UNIX) non 
funziona.

>
>>
>>> Terza domanda, dovendo stampare i valori dei clocks nella console, come
>>> faccio a scriverli sempre sulla stessa riga evitando così di riempire la
>>> console con due colonne di cifre che scorrono verso l'alto?
>>>
>>
>> Su sistemi UNIX puoi usare curses.
>> Ma ci sono anche altri modi più semplici e limitati.
> GB: ok, darò un occhio alla documentazione di curses ma volevo usare un metodo valido su più sistemi.
> Mi accenneresti a qualcuno degli altri metodi di cui scrivevi qui sopra?
>
> Io avevo pensato:
> 1. cancello tutto il contenuto della console e stampo una stringa che contiene entrambi i contatori, ad ogni secondo che passa.
> 2. Se esiste un carattere di controllo, o sequenza escape che simuli la pressione della freccia sù, potrei costringere la stampa sempre nella medesima riga, invece di farla scorrere verso il basso.

Usa il carattere '\r' che riporta il cursore a inizio riga.


Ciao  Manlio


Maggiori informazioni sulla lista Python