Newsgroup: it.comp.programmare.win32
Titolo: API tempo su win98

Salve a tutti,
qualcuno conosce un modo per ottenere temporizzazioni con precisione
nell'ordine del ms?
Io ho provato con la seguente procedura:
void delay(int ms)
{
int end;
end=clock()+(ms*0.001)*CLK_TCK;
while (clock()<=end) {};
}
Questa routine funziona bene per ritardi >10ms, ovvero l'errore commesso per
ritardi >10ms non è più paragonabile con il ritardo.
Io avrei necessità di utilizzare questa routine in una dll da richiamare dal
Matlab, in ambiente Windows 98. Ritengo (ditemi se ho torto!) che la routine
funzioni male per bassi valori di ms in quanto il ciclo di attesa potrebbere
essere interrotto da qualche altro task.
Se così fosse, come posso impedire che ciò avvenga?
Mi hanno anche detto che esista anche un'api di Windows che faccia al caso
mio, è vero?
(non sono affatto un programmatore esperto in ambiente Windows...)
Ringrazio anticipatamente chiunque avrà voglia di dedicarmi anche un solo
minuto
    Stefano


Potresti utilizzare l'API Sleep(int ms), che implementa un'attesa
passiva (cioè non consuma CPU time).
Per quanto riguarda la precisione di Sleep putroppo non è il massimo,
per valori sotto i 10 ms lo scarto è elevato, per avere un idea dei
tempi reali (ms) eccoti una piccola tabella:
T. Nominale     T. Reale Min    T. Reale Max
1                      0.1                   5.5 
5                      5.1                   9.9
10                    10                    14.8
50                    49                    53.2
GP

 wrote in message
N5aBOQesJpU1fduj2frsA7R=t=i...@4ax.com...

Ciao GP,
prima di tutto grazie per il tuo intervento.
Ho provato la API da te indicata, ma si è comportata esattamente come la mia
procedura.
Un test mi ha incuriosito: ho provato a fare un loop che richiamasse 1000
volte Sleep o delay.
In entrambi i casi ho avuto un risultato identico: se il parametro di Sleep
o delay era compreso
tra 1 e 5 ms il ritardo corrispondeva a 5ms, vale a dire il ritardo
complessivo era di, in ogni caso, di 5 secondi; se il parametro era tra 6 e
10 il ritardo complessivo era di 10 s; tra 11 e 15 avevo 15 s. Mi ha stupito
l'identico comportamento tra le due routine, evidentemente la causa è la
stessa. Come hai ottenuto i valori della tabella sulla precisione che mi hai
fornito l'altra volta? Io non riesco a spiegarmeli. Non esiste proprio un
altro sistema per ottenere temporizzazioni con "granularità" inferiore ai 5
ms?
Grazie ancora,
ciao
    Stefano

ms?
Se per temporizzazioni intendi ritardi ci sono 2 metodi (almeno quelli
che io conosco!) :
- ritardo passivo : si utilizza l'API Sleep, lo svantaggio è che la
precisione per intervalli di tempo sotto i 10 ms è scarsa, ma presenta
il notevole pregio di non consumare CPU time, cioè il tuo programma
viene "sospeso" dal SO per l'intervallo di tempo specificato nella
chiamata all'API Sleep.
- ritardo attivo: si utilizza del codice tipo
t1=GetTime;
ripeti
  t2=GetTime;
esci se (t2-t1)>=delay
La precisione di questa soluzione è elevata specialmente se usi le
soluzioni 2 e 3 per rilevare gli intervalli temporali, però presenta
uno svantaggio consuma CPU time (ho fatto qualche prova e a me si
pappa circa il 95% del CPU time!)
GP

fatto.
Hmm, io ero interessato alla cosa, ma come faccio a contattarti?
Potresti mettere almeno un indirizzo valido....
-- 
Ciao
DGP85
http://daps.cjb.net/

Ciao,
SetTimer, KillTimer, TimerProc sono le API che dovrebbero fare
al caso.
Saluti,
Bob Rock
-----------------------------------------------------------
Got questions?  Get answers over the phone at Keen.com.
Up to 100 minutes free!
http://www.keen.com