![](/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.