![]() 图一、实现微秒级的精确定时器 |
| MMRESULT timeSetEvent(UINT uDelay,UINT uResolution,LPTIMECALLBACK lpTimeProc, DWORD dwUser,UINT fuEvent); |
| # define ONE_MILLI_SECOND 1 //定义1ms和2s时钟间隔,以ms为单位 ; # define TWO_SECOND 2000 # define TIMER_ACCURACY 1 //定义时钟分辨率,以ms为单位 UINT wTimerRes_1ms,wTimerRes_2s; //定义时间间隔 UINT wAccuracy; //定义分辨率 UINT TimerID_1ms,TimerID_2s; //定义定时器句柄 /////////////////////////////// CCureApp::CCureApp():fout("cure.out", ios::out) //打开输出文件"cure.out"; { // 给时间间隔变量赋值 wTimerRes_1ms = ONE_MILLI_SECOND; wTimerRes_2s = TWO_SECOND; TIMECAPS tc; //利用函数timeGetDevCaps取出系统分辨率的取值范围,如果无错则继续; if(timeGetDevCaps(&tc,sizeof(TIMECAPS))==TIMERR_NOERROR) { wAccuracy=min(max(tc.wPeriodMin, //分辨率的值不能超出系统的取值范围 TIMER_ACCURACY),tc.wPeriodMax); //调用timeBeginPeriod函数设置定时器的分辨率 timeBeginPeriod(wAccuracy); //设置定时器 InitializeTimer(); } } CCureApp:: ~CCureApp() { fout <<"结束时钟"<< endl; //结束时钟 timeKillEvent(TimerID_1ms); // 删除两个定时器 timeKillEvent(TimerID_2s); // 删除设置的分辨率 timeEndPeriod(wAccuracy); } void CCureApp::InitializeTimer() { StartOneMilliSecondTimer(); StartTwoSecondTimer(); } //1ms定时器的回调函数,类似于中断处理程序,一定要声明为全局PASCAL函数, //否则编译会有问题 void PASCAL OneMilliSecondProc(UINT wTimerID, UINT msg,DWORD dwUser, DWORD dwl,DWORD dw2) { // 定义计数器 static int ms = 0; CCureApp *app = (CCureApp *)dwUser; // 取得系统时间,以ms为单位 DWORD osBinaryTime = GetTickCount(); //输出计数器值和当前系统时间 app->fout<<++ms<<":1ms:" } // 加装1ms定时器 void CCureApp::StartOneMilliSecondTimer() { if((TimerID_1ms = timeSetEvent(wTimerRes_1ms, wAccuracy, (LPTIMECALBACK) OneMil liSecondProc, // 回调函数; (DWORD)this, // 用户传送到回调函数的数据; TIME_PERIODIC)) == 0)//周期调用定时处理函数; { AfxMessageBox("不能进行定时!", MB_OK | MB_ICONASTERISK); } else fout << "16ms 计 时:" << endl; //不等于0表明加装成功,返回此定时器的句柄; } |
| // 起始值和中止值 DWORD dwStart, dwStop ; dwStop = GetTickCount(); while(TRUE) { // 上一次的中止值变成新的起始值 dwStart = dwStop ; // 此处添加相应控制语句 do { dwStop = GetTickCount() ; }while(dwStop - 50 < dwStart) ; } |
| BOOL QueryPerformanceFrequency (LARGE_INTEGER *lpFrequency); BOOL QueryPerformanceCounter (LARGE_INTEGER *lpCount); |
| typedef union _LARGE_INTEGER { struct{ DWORD LowPart ; // 4字节整型数 LONG HighPart ; // 4字节整型数 }; LONG QuadPart ; // 8字节整型数 } LARGE_INTEGER ; |
| ///////////////////////////////////////////////////////////////////////// LARGE_INTEGER MySleep(LARGE_INTEGER Interval) // 功能:执行实际的延时功能,Interval 参数为需要执行的延时与时间有关的数量,此函数返回执//行后实际所用的时间有关的数量 ; { LARGE_INTEGER privious, current, Elapse; QueryPerformanceCounter( &privious ); current = privious; while( current.QuadPart - privious.QuadPart < Interval.QuadPart ) QueryPerformanceCounter( ¤t ); Elapse.QuadPart = current.QuadPart - privious.QuadPart; return Elapse; } void CHightTimerDlg::OnTest() { // TODO: Add your control notification handler code here UpdateData(TRUE); //取输入的测试时间值到与编辑框相关联的成员变量m_dwTest中 ; LARGE_INTEGER frequence; //取高精度运行计数器的频率,若硬件不支持则返回FALSE if(!QueryPerformanceFrequency( &frequence)) MessageBox("Your computer hardware doesn't support the high-resolution performance counter", "Not Support", MB_ICONEXCLAMATION | MB_OK); LARGE_INTEGER test, ret; //通过频率换算微秒数到对应的数量(与CPU时钟有关),1秒=1000000微秒; test.QuadPart = frequence.QuadPart * m_dwTest / 1000000; ret = MySleep( test ); //调用此函数开始延时,返回实际花销的数量 ; m_dwAct = (DWORD)(1000000 * ret.QuadPart / frequence.QuadPart ); //换算到微秒数; UpdateData(FALSE); //显示到对话框面板 ; } |
文档说明:
相关文档
返回首页 | 关于本站 | | 友情链接 | 广告服务 | 意见建议 | 访客留言 | 本站论坛
Copyright© 2001-2006 ProgramBBS.com All Rights Reserved 版权所有©编程论坛
Email: 吉ICP备05009985号
感谢长春订餐网友情支持