簡體   English   中英

我有一段從FILETIME結構獲取持續時間的代碼。 這是什么意思?

[英]I have piece of code that gets duration from a FILETIME struct. What does it mean?

我有這個功能

void prtduration(const FILETIME *ft_start, const FILETIME *ft_end) 
{
    double duration = (ft_end->dwHighDateTime - ft_start->dwHighDateTime) *
        (7 * 60 + 9 + 496e-3)
        + (ft_end->dwLowDateTime - ft_start->dwLowDateTime) / 1e7;
    printf("duration %.1f seconds\n", duration);
    system("pause");
}

誰能解釋下一部分代碼的工作原理?

(ft_end->dwHighDateTime - ft_start->dwHighDateTime) *
            (7 * 60 + 9 + 496e-3)
            + (ft_end->dwLowDateTime - ft_start->dwLowDateTime) / 1e7;

哇! 一段令人費解的代碼。 讓我們嘗試簡化一下:

   // Calculate the delta
   FILETIME delta;
   delta.dwHighDateTime = ft_end->dwHighDateTime - ft_start->dwHighDateTime;
   delta.dwLowDateTime = ft_end->dwLowDateTime - ft_start->dwLowDateTime;

   // Convert 100ns units to double seconds.
   double secs = delta.dwHighDateTime * 429.496 + delta.dwLowDateTime/1E7

實際上,我認為這是錯誤的。 它應該是:

  double secs = delta.dwHighDateTime * 429.4967296 + delta.dwLowDateTime/1E7

甚至更清楚地:

  double secs = (delta.dwHighDateTime * 4294967296. + delta.dwLowDateTime)/10E6

發生的情況是高時間乘以2**32 (轉換為100ns單位,然后除以100ns得到秒。

注意,這仍然是錯誤的,因為delta的計算是錯誤的(與原始方法相同)。 如果減去較低的部分會產生下溢,則無法從較高的部分借用。 請參閱Microsoft的文檔:

不建議您從FILETIME結構中添加和減去值以獲得相對時間。 相反,您應該將文件時間的低位和高位部分復制到ULARGE_INTEGER結構,對QuadPart成員執行64位算術,然后將LowPart和HighPart成員復制到FILETIME結構中。

或者實際上,在這種情況下,只需將QuadPart轉換為double並除。 因此,我們最終得到:

    ULARGE_INTEGER start,end;
    start.LowPart  = ft_start->dwLowDateTime;
    start.HighPart = ft_start->dwHighDateTime;
    end.LowPart = ft_end->dwLowDateTime;
    end.HighPart = ft_end->dwHighDateTime;

    double duration = (end.QuadPart - start.QuadPart)/1E7;

撇開:我敢打賭,從未發現借用失敗的原因是,從未要求代碼打印持續時間超過7分9秒的時間(或者如果有,則沒有人仔細看過結果)。

當FileTime變量更改其值時, 7是非常近似的頻率。 也就是說,每隔7分鍾(+ -3甚至更多),它就會增加1。然后,將其乘以60,就可以在幾秒鍾內獲得價值。

9 + 496e-3-時間就是秒,它以某種方式處理了我們正在丟失的編譯(從提款開始到控制台輸出)。

確實,這是非常糟糕的代碼,我們不應該這樣寫。

但是,這迫使我更好地了解FileTime的工作。

感謝大家的回答,我非常感謝。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM