繁体   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