La API de Winsows GetTickCount nos devuelve el número de microsegundos desde que se inició el sistema hasta 49.7 días. Este intervalo suele ser suficientemente amplio como para abarcar cualquier medida de tiempo en una aplicación. Pero contiene dos cosas que no son apetecibles:
1. La cuenta no comienza desde cero sino desde el inicio del sistema.
2. Si llegamos al valor de 4294967295 microsegundos ($FFFFFFFF) que representan los 49.7 días, obtendermos un acarreo que hay que tener en cuenta.
En un reciente proyecto multimedia, en el que la medida temporal era determinante hasta la precisión del microsegundo, solucioné los dos inconvenientes con una simple función que me permite poner a cero la cuenta de microsegundos teniendo en cuenta el acarreo y, además, me devuelve el número de microsegundos transcurridos desde la puesta a cero.
Esta es la versión C:
DWORD GetTickNow(BOOL Start = FALSE) { static DWORD Old; if(Start) Old = GetTickCount(); if(GetTickCount() < Old) return GetTickCount() - Old + 0xFFFFFFFF; return GetTickCount() - Old; }
Y esta es la versión delphi:
function GetTickNow(Start: BOOL = FALSE): DWORD; const {$J+} Old: DWORD = 0; {$J-} begin if Start then Old:= GetTickCount(); if GetTickCount() < Old then Result:= GetTickCount() - Old + $FFFFFFFF else Result:= GetTickCount() - Old; end;
De esta forma, aunque el límite siguen siendo 49.7 días, lo es desde la puesta a cero. Si necesitáramos un intervalo mayor, podemos usar como valor de vuelta un QWORD (unsigned int64).
El uso es bien simple. Para poner a cero la cuenta:
GetTickNow(true);
Para obtener el tiempo desde la puesta a cero:
// Delphi T:= GetTickNow; // C/C++ T = GetTickNow();
Espero que sea de utilidad.
Saludos.