2012-01-02 43 views
12

Tôi muốn có sự khác biệt giữa hai biến SYSTEMTIME. Tôi đã thấy một người nào đó hỏi câu hỏi này ở đây trước đây, nhưng anh ta được yêu cầu chuyển đổi cả hai cấu trúc SYSTEMTIME thành FILETIME .. Có cách nào khác để có được sự khác biệt không?sự khác biệt giữa hai biến SYSTEMTIME

SYSTEMTIME st; 
GetSystemTime(&st); 

--- một số mã ở đây ---

SYSTEMTIME st2; 
    GetSystemTime(&st2); 

st-ST2?

+2

Tại sao bạn không thể làm những gì tất cả mọi người đề nghị và chuyển đổi 'SYSTEMTIME' cho 'FILETIME '? –

Trả lời

7

It says pretty clearly on the MSDN documentation:

Nó không được khuyến khích mà bạn thêm và trừ giá trị từ cấu trúc SYSTEMTIME để có được thời gian tương đối. Thay vào đó, bạn nên

  • Chuyển cấu trúc SYSTEMTIME thành cấu trúc FILETIME.
  • Sao chép cấu trúc FILETIME kết quả thành cấu trúc ULARGE_INTEGER.
  • Sử dụng số học 64 bit bình thường trên giá trị ULARGE_INTEGER.

Tại sao không làm chính xác điều đó?

+1

tôi muốn tránh điều này. nhưng, tôi sẽ làm những gì bạn gợi ý. làm thế nào để tôi trừ hai cấu trúc ULARGE_INTEGER tôi tạo ra? – kakush

+0

Bạn chỉ có thể sử dụng loại int 64 bit cho điều đó. Như đã nêu trên MSDN (http://msdn.microsoft.com/en-us/library/aa383742(v=VS.85).aspx): Trình biên dịch C của bạn có thể hỗ trợ các số nguyên 64 bit nguyên bản. Ví dụ, Microsoft Visual C++ hỗ trợ loại số nguyên có kích thước __int64. Để biết thêm thông tin, hãy xem tài liệu đi kèm với trình biên dịch C của bạn. – bobbymcr

5

FT1 và ft2 là các cấu trúc 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; 

khác biệt trong mili giây ...

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

Nếu phải là một vài giây trước đó sau đó trái ... sau đó có vẻ như bạn nhận được một thời gian thực sự lớn như câu trả lời của bạn? SYSTEMTIME được tạo bởi các thành viên WORD (unsigned), vì vậy nó không thể đại diện cho sự khác biệt thời gian âm. –

Các vấn đề liên quan