我有一段代码从 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
的计算是错误的(和原来的一样)。如果低位部分的减法下溢,则向高位部分借位失败。参见微软的文档:
It is not recommended that you add and subtract values from the FILETIME structure to obtain relative times. Instead, you should copy the low- and high-order parts of the file time to a ULARGE_INTEGER structure, perform 64-bit arithmetic on the QuadPart member, and copy the LowPart and HighPart members into the FILETIME structure.
或者实际上,在这种情况下,只需将 QuadPart 转换为加倍和除法。所以我们最终得到:
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 秒的持续时间(或者即使有,也没有人仔细查看过结果)。
7 非常接近 FileTime 变量更改其值时的频率。即,每 7(+-3 或什至更多)分钟它增加 1。然后我们将它乘以 60 以获得以秒为单位的值。
9 + 496e-3 - 以某种方式处理我们正在丢失的编译(从撤回开始到控制台输出)的时间是几秒钟。
真的,这是非常糟糕的代码,我们不应该这样写。
然而,它迫使我更好地了解 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;
哇!多么混乱的一段代码。让我们尝试简化它:
// 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
的计算是错误的(和原来的一样)。如果低位部分的减法下溢,则向高位部分借位失败。参见微软的文档:
It is not recommended that you add and subtract values from the FILETIME structure to obtain relative times. Instead, you should copy the low- and high-order parts of the file time to a ULARGE_INTEGER structure, perform 64-bit arithmetic on the QuadPart member, and copy the LowPart and HighPart members into the FILETIME structure.
或者实际上,在这种情况下,只需将 QuadPart 转换为加倍和除法。所以我们最终得到:
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 秒的持续时间(或者即使有,也没有人仔细查看过结果)。
7 非常接近 FileTime 变量更改其值时的频率。即,每 7(+-3 或什至更多)分钟它增加 1。然后我们将它乘以 60 以获得以秒为单位的值。
9 + 496e-3 - 以某种方式处理我们正在丢失的编译(从撤回开始到控制台输出)的时间是几秒钟。
真的,这是非常糟糕的代码,我们不应该这样写。
然而,它迫使我更好地了解 FileTime 工作。
谢谢大家的解答,非常感谢