windows 时间 定时 精度

 

通过 cpu tick 计算时间 

 

BOOL QueryPerformanceFrequency( LARGE_INTEGER* lpFrequency );

 

BOOL QueryPerformanceCounter( LARGE_INTEGER* lpPerformanceCount );

 

 

 

 

 

 

 

 

 

2010.10.31.

一、VC实现高精度定时器__基本流程

  1、头文件包含 #include   "mmsystem.h"   

    

  2、类成员中添加变量 UINT   m_iTimerId; //定时器句柄   

    

  3、创建回调函数,响应定时器事件

void   CALLBACK   CatchTimer

( UINT IDEvent,

 UINT uReserved,

 DWORD dwUser,

 DWORD dwReserved1,

 DWORD dwReserved2) 

{  //在这里写定时器事件的处理  }   

    

  4、开始启动定时器

//设置定时器分辨率,1ms   

timeBeginPeriod(1);   


//产生间隔100毫秒,周期执行的定时器事件;启动定时器   

m_iTimerId=timeSetEvent(1,100,CatchTimer,(DWORD)this->m_hWnd,TIME_PERIODIC);   

    

    

  5、结束使用定时器   

//删除定时器事件   

if(m_iTimerId)   

timeKillEvent(m_iTimerId);   

//清除定时器分辨率   

timeEndPeriod(1);   


设置两个时钟定时器,一个间隔是1毫秒,一个间隔是2秒,

每执行一次,输出当前系统时钟值到文件“cure.out”,以 比较此定时器的精确度。

(此程序在中文windows95及Microsoft VC5.0编译通过。只节取与定时器有关的部分程序。)     


#include   <   stdio.h   >   

  //包含所用系统函数的头文件,   

  如果编译有问题,可调整此语句的位置   

  #include   <   mmsystem.h   >   

    

  //定义1毫秒和2秒时钟间隔,以毫秒为单位   

  #define ONE_MILLI_SECOND1   

  #define TWO_SECOND 2000   

  //定义时钟分辨率,以毫秒为单位   

  #define TIMER_ACCURACY1   

    

  UINT   wTimerRes_1ms,wTimerRes_2s;     //定义时间间隔   

  UINT   wAccuracy;//定义分辨率   

  UINT   TimerID_1ms,TimerID_2s;//定义定时器句柄   

    

  CCureApp::CCureApp()   

  :   fout("cure.out",   ios::out)//打开输出文件“cure.out”   

  {   

  //   TODO:   add   construction   code   here,   

  //   Place   all   significant   

                initialization   in   InitInstance   

  //给时间间隔变量赋值   

  wTimerRes_1ms   =   ONE_MILLI_SECOND ;   

  wTimerRes_2s   =   TWO_SECOND;   

    

  TIMECAPS   tc;   

  //通过函数timeGetDevCaps取出系统   

  的分辨率取值范围(对intel系统,   

  1~16毫秒),//如果无错则继续   

  if(timeGetDevCaps(&tc,   sizeof(TIMECAPS))   

  ==   TIMERR_NOERROR)   

  {   

  //分辨率的值不能超出系统的取值范围   

  wAccuracy   =   min(max(tc.wPeriodMin,   

  TIMER_ACCURACY),tc.wPeriodMax);   

  //调用timeBeginPeriod函数设置定时器   

  的分辨率,类似于for循环的步长   

  timeBeginPeriod(wAccuracy);   

  //设置定时器   

  InitializeTimer();   

  }   

  }   

    

  CCureApp::~CCureApp()   

  {   

  //结束时钟   

  fout   <   <     "结束时钟"   <   <     endl;   

  //删除两个定时器   

  timeKillEvent(TimerID_1ms);   

  timeKillEvent(TimerID_2s);   

  //删除设置的分辨率   

  timeEndPeriod(wAccuracy);   

  }   

  注:使用完的定时器及分辨率一定   

  要删除,否则系统会越来越慢。   

    

  void CCureApp::InitializeTimer()   

  {   

  StartOneMilliSecondTimer();   

  StartTwoSecondTimer();   

  }   

    

  //一毫秒定时器的回调函数,   

  类似于中断处理程序   

  voidPASCAL//一定要声明为全局PASCAL函数,   

  否则编译会有问题   

  OneMilliSecondProc(UINT wTimerID,   UINT   msg,   

  DWORD dwUser,   DWORD   dw1,   DWORD   dw2)   

  {   

  static int ms   =   0;//定义计数器   

  CCureApp *app   =   (CCureApp   *)dwUser;   

  //取得系统时间以毫秒为单位   

  DWORD   osBinaryTime   =   GetTickCount();   

  //输出计数器值和当前系统时间到文件   

  app-   >fout   <   <     ++ms   <   <     ":   1ms   :   "   

    <   <     osBinaryTime   <   <     endl;   

  }   

    

  //加装1毫秒定时器   

  void   CCureApp::StartOneMilliSecondTimer()   

  {   

  if((TimerID_1ms   =   timeSetEvent(wTimerRes_1ms,   wAccuracy,   

    (LPTIMECALLBACK)   OneMilliSecondProc,//回调函数   

    (DWORD)this,//用户自传送到回调函数的数据   

  /*周期调用,只使用一次用TIME_ONESHOT*/   

  TIME_PERIODIC))   ==   0)   

  {   

  AfxMessageBox("不能计时",   MB_OK   |   MB_ICONASTERISK);   

  }   

  else//不等于0表明加装成功,   

  返回此定时器的句柄   

  fout   <   <     "16ms计时:"   <   <     endl;   

  }   

    

  以下为2秒定时器的回调函   

  数和加装函数,与1毫秒的类似;   

  void   PASCAL   

  TwoSecondProc(UINT wTimerID,   UINT   msg,   

      DWORD dwUser,   DWORD   dw1,   DWORD   dw2)   

  {   

  static int s   =   0;   

  CCureApp *app   =   (CCureApp   *)dwUser;   

  DWORD   osBinaryTime   =   GetTickCount();   

  app-   >fout   <   <     "***********************   

  ***********************"   <   <     endl;   

  app-   >fout   <   <     ++s   <   <     ":   2s   :   "   

    <   <     osBinaryTime   <   <     endl;   

  }   

    

  void CCureApp::StartTwoSecondTimer()   

  {   

  if((TimerID_2s   =   timeSetEvent(wTimerRes_2s,   wAccuracy,   

    (LPTIMECALLBACK)   TwoSecondProc,   

    (DWORD)this,   

      TIME_PERIODIC))   ==   0)   

  {   

  AfxMessageBox("不能计时",   MB_OK   |   MB_ICONASTERISK);   

  }   

  else   

  fout   <   <     "2s计时:"   <   <     endl;   

  }     

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值