我在Windows中看到很多关于高精度计时器的问题,但我真正需要的是能够让我在窗口中获得比10-15ms粒度GetLocalTime()提供的更精确的时间。
我找不到任何现有的简单解决方案,所以我想出了一个我自己的,没有完全刷新,但基本的想法一直工作到午夜。在这里分享它可以对其他人有所帮助。
在程序启动时存储锚定时间并使用timeGetTime()以ms为单位获得系统正常运行时间(粒度小于1 ms)并相应地调整anchortime。
代码就在答案中。
答案 0 :(得分:-1)
第一次运行它时,它会得到时间和计时器,因此它们是同步的,我们有一些东西需要测量。 init部分不是线程安全的,它不会在午夜结束,但是可以通过下面的进位表单轻松添加....
// this solution is limited to 49+ days of uptime
int timeinitted = 0;
SYSTEMTIME anchortime;
DWORD anchorticks;
void GetAccurateTime(SYSTEMTIME *lt)
{
if (timeinitted == 0)
{ // obviously this init section isn't threadsafe.
// get an anchor time to sync up with system ticks.
GetLocalTime(&anchortime);
anchorticks = timeGetTime();
timeinitted = 1;
}
DWORD now = timeGetTime();
DWORD flyby = now - anchorticks;
// now add flyby to anchortime
memcpy (lt, &anchortime, sizeof(anchortime));
// you can't do the math IN the SYSTEMTIME because everything in it is a WORD (16 bits)
DWORD ms = lt->wMilliseconds + flyby;
DWORD carry = ms / 1000;
lt->wMilliseconds = ms % 1000;
if (carry > 0)
{
DWORD s = lt->wSecond + carry;
carry = s / 60;
lt->wSecond = s % 60;
if (carry > 0)
{
DWORD m = lt->wMinute + carry;
carry = m / 60;
lt->wMinute = m % 60;
if (carry > 0) // won't wrap day correctly.
lt->wHour = (((DWORD)lt->wHour + carry)) % 24;
}
// add day and month and year here if you're so inspired, but remember the 49 day limit
}
}