Newsgroup: it.comp.programmare.win32
Titolo: Cronometro sotto Windows

Sto scrivendo una utility che mi faccia da cronometro, sotto Windows.
Lavoro in C++, e uso le funzioni gettime e settime che danno una
precisione al centesimo di secondo. Per i miei scopi basta e avanza,
per� quanto sono realmente precisi i tempi presi con queste funzioni?
Usando un timer potrei arrivare al millesimo di secondo, ma anche l� non
so quanto posso fidarmi, poi, dell'ultima cifra dei millesimi.
C'� mica qualcuno che sa quanto pu� essere preciso un programma sotto
Windows, per quanto riguarda la misura dei tempi? O magari sa dove
reperire tali informazioni?
Grazie...

 Grazie...
Non usando un sistema in real time, la precisione è 4 ceste di frutta.
(la cosa si applica a quasi qualsiasi sistema operativo multitasking non rt)
Mi spiego: hai un sistema che esegue una serie di task su un numero
limitato di cpu (numero sempre inferiore al numero di task).
Ciascun processo ha tra le altre informazioni una priorità.
Il sistema operativo divide la/e cpu in modo da permettere ai vari
processi di girare come se fossero in parallelo.
In pratica assegna degli slot temporali ai vari processi in base allo
stato di questi (ad esempio se sono in attesa del kernel, se stanno
eseguendo codice, o altro), e in base alla priorità.
In modo molto semplice, un processo a più alta priorità fa la parte del
leone, un processo a più bassa priorità rimane in sleep e sfrutta solo i
tempi morti.
La priorità più elevata è il real time.
Se il tuo cronometro fosse ad alta priorità hai una precisione molto
buona. Se fosse (come è) a priorità normale, a sistema scarico
(nient'altro che gira) hai una discreta precisione (penso al
millisecondo). Basta che il sistema faccia qualcos'altro (tipo accedere
alla swap, o eseguire un accesso in rete per vedere se aggiornare Java)
e puoi sgarrare anche di qualche secondo.
Occhio che ad alzare la priorità di un processo è pericoloso perché se
quel processo si impalla per qualsiasi motivo, ti può bloccare la macchina.
PSK

 Grazie...
L'unico metodo per essere piu' precisi e' usare la GetTickCount.
La precisione e' espressa in millisecondi e l'aggiornamento dei valori 
avviene ogni 20 / 50 ms dipende dal sistema operativo.
Fai solo attenzione al rollback.

Guglielmo Calligaro ha scritto:

Sulle macchine moderne c'ï¿œ anche un modo per essere moooooolto + precisi 
e si chiama RDTSC (ReaD Time Stamp Counter). In pratica si tratta di un 
contatore a 64 bit HARDWARE che conta direttamente i clock della CPU (o 
comunque un segnale derivato dal clock) 
http://en.wikipedia.org/wiki/Time_Stamp_Counter
Siccome siamo sotto win, all'utilizzo diretto di RDTSC ï¿œ preferibile 
l'utilizzo delle QueryPerformanceFrequency e QueryPerformanceCounter
La precisione raggiungibile dipende dalla CPU ma in pratica sfonda 
abbondantemente il microsecondo.
OCCHIO alle macchine multi CPU (o anche multicore). Se vuoi stare 
tranquillo al 100%, dovresti settare l'affinitï¿œ del thread che esegue i 
timing ad una sola CPU.
Ovvio che quando da un processo utente chiami la RDTSC, c'ï¿œ un certo 
margine di incertezza dovuto al SO come ti dicevano nell'altra risposta...
HTH
Beppe

 reperire tali informazioni?
La precisione varia da un hardware all'altro ed anche in funzione della 
temperatura, per cui nessuno pu� dire quant'� preciso il *tuo* cronometro.
Io calcolo la precisione dei timer sincronizzando l'orologio di sistema con 
Dimension 4; dal suo log vedi l'entit� della correzione e quanto tempo � 
trascorso dall'ultima sincronizzazione, puoi cos� calcolare la precisione (o 
la stabilit�) dei timer.
Cristiano 

 per� quanto sono realmente precisi i tempi presi con queste funzioni?
Hai due possibilit� per ottenere timings pi� precisi:
-Usare un multimedia timer (vedi timeSetEvent() e amici). A differenza dei
normali timer, i multimedia timer agiscono in kernel mode, e la funzione
callback registrata con timeSetEvent() viene chiamata da dentro un thread a
priorit� realtime. Quindi sei maggiormente "immune" dall'effetto dello
scheduler e ti puoi aspettare che la tua funzione callback sia chiamata a
intervalli pi� regolari. Poi dentro alla callback puoi usare
QueryPerformanceCounter() come ti hanno gi� consigliato.
-Ancora meglio, se il tuo trigger � esterno (es. un pulsante), collegalo a
un ingresso audio e usa la scheda sonora. Con le funzioni multimediali di
Windows puoi campionare il tuo ingresso audio con una risoluzione (e questa
volta reale, del tutto indipendente dall'OS) di 1/48000 s.
-- 
emboliaschizoide.splinder.com

 un ingresso audio e usa la scheda sonora.
Non mi serve un trigger esterno, il mio scopo era molto pi� "casalingo",
diciamo, e credo che la precisione ottenibile da software (grossomodo
1/100 di secondo se ho capito bene) sia sufficiente.
Per� cercando in giro per internet non ho trovato nessun programmino che
fa quello che mi serviva, da cui l'idea di scrivermelo, e allora ho
pensato che magari valeva la pena di fare uno sforzino in pi� e scrivere
qualcosa da rilasciare opensource, dopo... farci un bel progettino su
sourceforge magari.

 sourceforge magari.
Beh, se cerchi "stopwatch" con google salta fuori parecchia roba, ma
dipende da cosa vuoi fare esattamente...
-- 
emboliaschizoide.splinder.com

 Grazie...
Se puï¿œ esserti utile:
http://support.microsoft.com/kb/172338
-- 
Raffaele Rialdi  
http://www.iamraf.net
Weblog: 
http://blogs.ugidotnet.org/raffaele
Microsoft .NET MVP 
http://mvp.support.microsoft.com
 -
UGIdotNET - 
http://www.ugidotnet.org

 fa quello che mi serviva, da cui l'idea di scrivermelo, e allora ho
Io ho uso FreeWatch.exe
Non ricordo a da dove lo avevo scaricato, cmq ho questi riferimenti
che ti possono aiutare a ritrovarlo.
FreeWatch V1.2 , One Red Frog LLC
Poi dipendende da cosa ti serve...