我GetSystemTimeAdjustment在Windows 7上使用该功能运行了一些测试,得到了一些我无法解释的有趣结果.正如我所理解的那样,如果系统时间定期同步,则该方法应该返回,如果是,则在哪个时间间隔以及更新它的增量(请参阅MSDN上的GetSystemTimeAdjustment函数).
从此我可以看出,如果我查询系统时间,例如GetSystemTimeAsFileTime重复使用,我应该不做任何更改(系统时钟尚未更新),或者是检索到的增量的倍数的更改GetSystemTimeAdjustment.问题一:这个假设是否正确?
现在考虑以下测试代码:
#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, …Run Code Online (Sandbox Code Playgroud) 以下代码段
[DllImport("winmm.dll", EntryPoint = "timeBeginPeriod")]
public static extern uint TimeBeginPeriod(uint uMilliseconds);
static void Main(string[] args)
{
if (TimeBeginPeriod(1) != 0)
Console.WriteLine("TimeBeginPeriod failed!");
Console.WriteLine("Sleep");
Stopwatch sw = Stopwatch.StartNew();
for (int i = 0; i < 10; i++)
{
Thread.Sleep(1);
Console.WriteLine(sw.ElapsedTicks * 1000d / Stopwatch.Frequency);
sw.Restart();
}
Console.WriteLine("Threading.Timer");
sw = null;
System.Threading.Timer t = null;
int n = 0;
t = new Timer(state =>
{
if (sw == null)
sw = Stopwatch.StartNew();
else
{
Console.WriteLine(sw.ElapsedTicks * 1000d / Stopwatch.Frequency);
n++;
sw.Restart();
} …Run Code Online (Sandbox Code Playgroud)