实现 GetTickCount64

来源:互联网 发布:校园网络逻辑拓扑图 编辑:程序博客网 时间:2024/05/22 14:50

GetTickCount64API 要求在Vista/2008以上系统使用

一下方法使用API 高精度计数器 和 GetTickCount 等多种方式实现GetTickCount64的功能

struct _tagGlobalTickCount_t{  //API ULONGLONG WINAPI GetTickCount64(void);  typedef ULONGLONG (WINAPI *GETTICKCOUNT64)(void);  GETTICKCOUNT64 pGetTickCount64;  //HIGH-RESOLUTION PERFORMANCE COUNTER  BOOL bMMTimeValid;  LARGE_INTEGER m_Start, m_Freq;  _tagGlobalTickCount_t()  {    pGetTickCount64 = NULL;    bMMTimeValid = FALSE;    memset(&m_Start, 0, sizeof(m_Start));    memset(&m_Freq, 0, sizeof(m_Freq));    if(pGetTickCount64 = (GETTICKCOUNT64)GetProcAddress(      GetModuleHandle("Kernel32.dll"), "GetTickCount64")) //API valid    {      OutputDebugStringA( "GetTickCount64 API Valid\r\n" );    }    else if( QueryPerformanceCounter(&m_Start)       && QueryPerformanceFrequency(&m_Freq) ) //high-resolution count valid    {      bMMTimeValid = TRUE;      OutputDebugStringA( "high-resolution count valid\r\n" );    }    else //use default time    {      OutputDebugStringA( "just GetTickCount() support only\r\n" );    }  }  ULONGLONG GetTickCount64(void)  {    if(pGetTickCount64) //api    {      return pGetTickCount64();    }    else if(bMMTimeValid) //high-resolution count    {      LARGE_INTEGER m_End = {0};      QueryPerformanceCounter(&m_End);      return (ULONGLONG)((m_End.QuadPart - m_Start.QuadPart) / (m_Freq.QuadPart / 1000));    }    else //normal    {      return GetTickCount();    }  }}GlobalTickCount;#define _GetTickCount64() ( GlobalTickCount.GetTickCount64() )

//测试  TRACE(_T("%I64u\n"), _GetTickCount64());