![](/img/trans.png)
[英]What does a negative dwLowDateTime mean in the FILETIME structure?
[英]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.