实现 GetTickCount64

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());  



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值