如何在Windows中将时钟时间精确到1ms?

时间:2012-11-14 18:23:57

标签: windows time clock

我在Windows中看到很多关于高精度计时器的问题,但我真正需要的是能够让我在窗口中获得比10-15ms粒度GetLocalTime()提供的更精确的时间。

我找不到任何现有的简单解决方案,所以我想出了一个我自己的,没有完全刷新,但基本的想法一直工作到午夜。在这里分享它可以对其他人有所帮助。

在程序启动时存储锚定时间并使用timeGetTime()以ms为单位获得系统正常运行时间(粒度小于1 ms)并相应地调整anchortime。

代码就在答案中。

1 个答案:

答案 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
       }
  }