我有一段代码从FILETIME结构获取持续时间。这是什么意思?

时间:2016-03-16 07:28:18

标签: c++ winapi filetime

我有这个功能

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;

2 个答案:

答案 0 :(得分:5)

哇!什么是混淆的代码。让我们试着简化它:

   // 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秒的持续时间(或者如果有的话,没有人仔细查看结果)。

答案 1 :(得分:0)

当FileTime变量更改其值时,

7 非常接近频率。也就是说,它每增加7(+ -3或更多)分钟,然后我们将其乘以60以获得数秒的值。

9 + 496e-3 - 时间是以某种方式处理我们正在失去的编译(从撤回开始到控制台输出)的秒数。

真的,这是非常糟糕的代码,我们不应该这样写。

然而,这迫使我更好地了解FileTime的工作。

感谢大家的回答,我非常感激。