【发布时间】:2011-12-02 21:36:34
【问题描述】:
我在 Windows 7 上使用GetSystemTimeAdjustment 函数进行了一些测试,得到了一些我无法解释的有趣结果。据我了解,如果系统时间定期同步,则此方法应返回,如果是,则更新时间间隔和增量(see GetSystemTimeAdjustment function on MSDN)。
据此我认为,如果我查询系统时间,例如使用GetSystemTimeAsFileTime 重复,我应该没有变化(系统时钟尚未更新),或者变化是@检索到的增量的倍数987654324@。 问题一:这个假设正确吗?
现在考虑以下测试代码:
#include <windows.h>
#include <iostream>
#include <iomanip>
int main()
{
FILETIME fileStart;
GetSystemTimeAsFileTime(&fileStart);
ULARGE_INTEGER start;
start.HighPart = fileStart.dwHighDateTime;
start.LowPart = fileStart.dwLowDateTime;
for (int i=20; i>0; --i)
{
FILETIME timeStamp1;
ULARGE_INTEGER ts1;
GetSystemTimeAsFileTime(&timeStamp1);
ts1.HighPart = timeStamp1.dwHighDateTime;
ts1.LowPart = timeStamp1.dwLowDateTime;
std::cout << "Timestamp: " << std::setprecision(20) << (double)(ts1.QuadPart - start.QuadPart) / 10000000 << std::endl;
}
DWORD dwTimeAdjustment = 0, dwTimeIncrement = 0, dwClockTick;
BOOL fAdjustmentDisabled = TRUE;
GetSystemTimeAdjustment(&dwTimeAdjustment, &dwTimeIncrement, &fAdjustmentDisabled);
std::cout << "\nTime Adjustment disabled: " << fAdjustmentDisabled
<< "\nTime Adjustment: " << (double)dwTimeAdjustment/10000000
<< "\nTime Increment: " << (double)dwTimeIncrement/10000000 << std::endl;
}
在一个循环中需要 20 个时间戳并将它们打印到控制台。最后,它打印系统时钟更新的增量。我希望循环中打印的时间戳之间的差异为 0 或该增量的倍数。但是,我得到这样的结果:
Timestamp: 0
Timestamp: 0.0025000000000000001
Timestamp: 0.0074999999999999997
Timestamp: 0.01
Timestamp: 0.012500000000000001
Timestamp: 0.014999999999999999
Timestamp: 0.017500000000000002
Timestamp: 0.022499999999999999
Timestamp: 0.025000000000000001
Timestamp: 0.0275
Timestamp: 0.029999999999999999
Timestamp: 0.032500000000000001
Timestamp: 0.035000000000000003
Timestamp: 0.040000000000000001
Timestamp: 0.042500000000000003
Timestamp: 0.044999999999999998
Timestamp: 0.050000000000000003
Timestamp: 0.052499999999999998
Timestamp: 0.055
Timestamp: 0.057500000000000002
Time Adjustment disabled: 0
Time Adjustment: 0.0156001
Time Increment: 0.0156001
因此,系统时间似乎使用大约 0.0025 秒的间隔更新,而不是 GetSystemTimeAdjustment 返回的 0.0156 秒。
问题二:这是什么原因?
【问题讨论】:
标签: c++ windows timing windows-7-x64