2012-01-02 15 views
12

Quiero obtener la diferencia entre dos variables SYSTEMTIME. Vi que alguien hizo esta pregunta aquí antes, pero le dijeron que convierta ambas estructuras de SYSTEMTIME a FILETIME .. ¿Hay alguna otra forma de obtener la diferencia?diferencia entre dos SYSTEMTIME variable

SYSTEMTIME st; 
GetSystemTime(&st); 

--- --- algún código aquí

SYSTEMTIME st2; 
    GetSystemTime(&st2); 

st-ST2?

+2

Por qué no puedes hacer lo que recomienda a todo el mundo y convertir el '' SYSTEMTIME' a FILETIME ¿? –

Respuesta

7

It says pretty clearly on the MSDN documentation:

No se recomienda que sumar y restar los valores de la estructura SYSTEMTIME obtener tiempos relativos. En su lugar, debe

  • Convierta la estructura SYSTEMTIME en una estructura FILETIME.
  • Copie la estructura FILETIME resultante en una estructura ULARGE_INTEGER.
  • Utilice una aritmética normal de 64 bits en el valor ULARGE_INTEGER.

¿Por qué no hacer exactamente eso?

+1

quería evitar esto. pero, haré lo que sugiriste. ¿Cómo deduzco las dos estructuras ULARGE_INTEGER que creé? – kakush

+0

Puedes usar un tipo int de 64 bits para eso. Como también se indica en MSDN (http://msdn.microsoft.com/en-us/library/aa383742(v=VS.85).aspx): Su compilador de C puede admitir enteros de 64 bits de forma nativa. Por ejemplo, Microsoft Visual C++ admite el tipo entero de tamaño __int64. Para obtener más información, consulte la documentación incluida con su compilador de C. – bobbymcr

5

FT1 y m2 son estructuras FILETIME

ULARGE_INTEGER ul1; 
    ul1.LowPart = ft1.dwLowDateTime; 
    ul1.HighPart = ft1.dwHighDateTime; 

ULARGE_INTEGER ul2; 
    ul2.LowPart = ft2.dwLowDateTime; 
    ul2.HighPart = ft2.dwHighDateTime; 


ul2.QuadPart -= ul1.QuadPart; 

diferencia en milisegundos ...

ULARGE_INTEGER uliRetValue; 
    uliRetValue.QuadPart = 0; 


    uliRetValue = ul2; 
    uliRetValue.QuadPart /= 10; 
    uliRetValue.QuadPart /= 1000; // To Milliseconds 
19
SYSTEMTIME operator-(const SYSTEMTIME& pSr,const SYSTEMTIME& pSl) 
{ 
    SYSTEMTIME t_res; 
    FILETIME v_ftime; 
    ULARGE_INTEGER v_ui; 
    __int64 v_right,v_left,v_res; 
    SystemTimeToFileTime(&pSr,&v_ftime); 
    v_ui.LowPart=v_ftime.dwLowDateTime; 
    v_ui.HighPart=v_ftime.dwHighDateTime; 
    v_right=v_ui.QuadPart; 

    SystemTimeToFileTime(&pSl,&v_ftime); 
    v_ui.LowPart=v_ftime.dwLowDateTime; 
    v_ui.HighPart=v_ftime.dwHighDateTime; 
    v_left=v_ui.QuadPart; 

    v_res=v_right-v_left; 

    v_ui.QuadPart=v_res; 
    v_ftime.dwLowDateTime=v_ui.LowPart; 
    v_ftime.dwHighDateTime=v_ui.HighPart; 
    FileTimeToSystemTime(&v_ftime,&t_res); 
    return t_res; 
} 
+0

Si está en lo cierto unos segundos antes que la izquierda ... ¿entonces parece que la respuesta es realmente grande? SYSTEMTIME está hecho de miembros WORD (sin signo), por lo que no puede representar diferencias de tiempo negativas. –