Newsgroup: it.comp.lang.delphi
Titolo: SecondSpan

Salve
devo registrare il tempo impiegato dall'utente a dare delle risposte.
Cosě appena lanciata la domanda registro il tempo:
  tstart:= now;
Quando l'utente risponde premendo un tasto calcolo la differenza che deve
avere una precisione in millisecondi ed espressa in secondi, quindi:
  tdelta := SecondSpan(now, tstart);
tdelta č un double, tstart un Tdatetime.
Funziona tutto, perň mi sono accorto(o meglio mi č stato fatto notare) che i
tempi calcolati sono, per quanto riguarda i millesimi, poco attendibili.
Ecco i tempi:
0,230  1,451 0,761 2,870  0,081  5,930  3,561
I tempi ad "occhio" sono giusti ma i millesimi terminano sempre per 1 o 0.
Ho fatto  infinite prove, mai la parte millesimale che sia 1,347 piuttosto
che 2,878, termina sempre per 1 o 0. Stesso discorso se uso MillisecondSpan.
Da cosa puň dipendere? Devo settare qualcosa a livello di sistema prima di
registrare i tempi? Cosa mi consigliate?
Ciao
Andrea

 registrare i tempi? Cosa mi consigliate?
Prova con GetTickCount
-- 
Lis
ICQ#: 162857023, 
Mercatino: 
http://snurl.com/sito_lis
FAQ di it.comp.lang.delphi: 
http://snipurl.com/faq_icld

Andrea
	Ciao
	MassimoB
 


Si, l'avevo notata, ma MilliSecondSpan presenta lo stesso problema di
SecondSpan.
ho provato anche a registrare il tempo non con now ma con l'api del tempo di
sistema:
  getsystemtime(systime);
  tstart:=SystemTimeToDateTime(systime);
  getsystemtime(systime);
  tstop:= SystemTimeToDateTime(systime);
  tdelta:= secondspan(tstop, tstart);
Purtroppo ho sempre lo stesso inconveniente: millesimi che terminano per 1 o
0. Stesso discorso se faccio tutto manualmente con
EncodeDatetime..
Comincio a pensare che sia un problema di approssimazioni a livello CPU..
mmah..
grazie


Sei fuori dal cosidetto "Time resolution" che, da quel che so è 10ms
(che poi con gli arrotontamenti potrebbe mostrarti appunto degli 0 o
degli 1)
Se hai bisogni di utilizzare i millesimi, esiste una API in mmsystem
che si chiama TimeGetTime che dovrebbe fare al caso tuo.
Ciao.
-- 
"La velocità luce non è sufficiente Comandante Nunziatella, 
dobbiamo passare alla velocità smodata!"

 che si chiama TimeGetTime che dovrebbe fare al caso tuo.
non la conoscevo
Mi manca giusto questa da provare.. provo e faccio sapere
grazie
ciao

 ciao
perchè non prendi in considerazione la mia risposta?
puoi fare una cosa del genere:
iTime := GetTickCount;
.
. quello che devi fare
.
iDelta := GetTickCount - iTime
e hai il numero di millisecondi trascorsi


e hai il numero di millisecondi trascorsi
Perché gettickcount AFAIK lavora con la stessa "time resolution" ;-)
Il valore minimo sarà di 10ms



Ho provato anche questo e come per GetTickCount ho risultati accettabili
solo per intervalli superiori al secondo.
Se la risposta č inferiore al secondo(ed č questo il caso piů ricorrente)
l'ultimo millesimo č 0 o 1
Visto che non ho risultati migliori, utilizzerň la piů semplice SecondSpan
Grazie
ciao


Ho provato anche questo e come per TimeGetTime ho risultati accettabili solo
per intervalli superiori al secondo.
Se la risposta è inferiore al secondo(ed è questo il caso più ricorrente)
l'ultimo millesimo è 0 o 1
Visto che non ho risultati migliori, utilizzerò la più semplice SecondSpan
Grazie
ciao

 ciao
Hai visto la QueryPerformanceCounter?
http://www.delphifaq.com/fq/q2113.shtml



Hai ragione, ho risolto cosě.
In un primo momento non notavo differenze ma poi settando la precisione con
timeBeginPeriod(1) ho buoni risultati:
//tempo fine domanda
  timeBeginPeriod(1);
  tstart:=timegettime;
//tempo risposta
  tstop:= timegettime;
  timeEndPeriod(1);
  tdelta:=tstop - tstart;
  tsec:= tdelta / 1000;
Grazie mille
Ciao
Andrea


Si, è buona anche questa.
Adesso valuto se usare questa o timegettime.
Ditemi voi se un cliente si attacca ai millesimi.....
Che poi secondo me una risoluzione simile per lo scopo del prog è da
pazzi... Che senso ha valutare i millesimi quando si risponde pigiando un
tasto della tastiera; già la differenza di durezza tra un tasto di una
tastiera e un tasto di un'altra tastiera influisce sul calcolo.
L'approssimazione al centesimo per me era più che sufficiente, ma si sa....
il cliente ha sempre ragione..
Grazie
ciao
Andrea

Ditemi voi se un cliente si attacca ai millesimi.....
Personalmente parlando ho visto clienti attaccarsi a ben altro... pensa che
per 10 euro di aumento istat su un canone assistenza ci siamo presi degli
"imbroglioni","ladri","iene", "disonesti".... come fai a lavorare serenamente
con gente cosi'? Prima ti fanno l'insoluto, poi ti insultano... per 10 euro di
aumento legittimo!
 
Cmq nella maggior parte dei casi, clienti come quello di cui parli e' meglio
perderli, ma lasciando che siano loro a fare il passo decisivo: mai rompere tu
direttamente. (mio consiglio personale).
Ciao
-- 
Morde. 
(
mo...@despammed.com
)
M-List di icld: 
http://it.groups.yahoo.com/group/icld/

 Adesso valuto se usare questa o timegettime.
Hai poi avuto modo di provarla? Se sě, funziona bene?



Si, ed in effetti ho usato proprio questa piuttosto che TimeGetTime che
richiedeva anche di settare la risoluzione.
L'unica cosa č che č una funzione supportata dai pentium in su, in pratica
utilizza un contatore interno disponibile appunto solo dai pentium in su ed
equivalenti.
Si legge la frequenza del contatore e si calcola la differenza dei
rispettivi tempi ed il gioco č fatto.
Al create della form mi assicuro che la funzione sia supportata
   //flag per alta risoluzione (se supportata)
   HighRes := QueryPerformanceFrequency(Freq);
Poi calcolo la differenza dei tempi registrati
  //registro tempo
    if HighRes then
      QueryPerformanceCounter(tstartHR)
.....
   if HighRes then begin
      QueryPerformanceCounter(tstopHR);
      tdelta:= (tstopHR - tstartHR) / Freq;
   end ;
Ciao e grazie
Andrea

 equivalenti.
Perfetto, grazie a te del feedback, buono a sapersi
