工控机,98+vcc+mfc,定时器的精度太低,如何处理 点击:1426 | 回复:3



john0718

    
  • 精华:0帖
  • 求助:1帖
  • 帖子:55帖 | 143回
  • 年度积分:208
  • 历史总积分:7422
  • 注册:2002年5月20日
发表于:2003-09-17 20:23:00
楼主
请问,工控机,98+vcc+mfc,定时器的精度太低,如何处理



呆客板凳

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 20回
  • 年度积分:0
  • 历史总积分:27
  • 注册:2002年10月23日
发表于:2002-12-24 14:47:00
1楼
在 Windows API 里头 有一套叫做 Multimedia timer 的定时器机制 它是利用系统中的 event 对象 而非传统的 WM_TIMER 讯息来达成 精度较高且误差较小 可以到达 1 ms 的分辨率 你可以试试看 请参考 MSDN 里头的 Multimedia Timer Functions timeBeginPeriod timeEndPeriod timeGetDevCaps timeGetSystemTime timeGetTime timeKillEvent TimeProc timeSetEvent

zhaoqm

  • 精华:1帖
  • 求助:0帖
  • 帖子:12帖 | 59回
  • 年度积分:0
  • 历史总积分:156
  • 注册:2002年11月17日
发表于:2003-09-17 20:23:00
2楼
没错,这个我做过多媒体定时器

数控才鸟

  • 精华:0帖
  • 求助:0帖
  • 帖子:3帖 | 9回
  • 年度积分:0
  • 历史总积分:34
  • 注册:2004年11月24日
发表于:2004-11-26 16:48:00
3楼
下面的可以做到延时1 us 和cpu速度无关 #define OVERHEAD 0xFFFFFFFF static int DelayMicorSecond(double us) { LARGE_INTEGER PerFreq; LONGLONG StartQuad,StopQuad; double dFreq,dTime,deltaQuad; if(QueryPerformanceFrequency(&PerFreq)) dFreq = (double)PerFreq.QuadPart; else AfxMessageBox("Error"); QueryPerformanceCounter(&PerFreq); StartQuad = PerFreq.LowPart; int nCount = 0; while(true) { // DunselFunction();//delay function QueryPerformanceCounter(&PerFreq); StopQuad = PerFreq.LowPart; deltaQuad =(double)( (StopQuad>=StartQuad)?(StopQuad-StartQuad):(StopQuad-StartQuad+OVERHEAD)); dTime = (double)(deltaQuad/dFreq); nCount++; if(dTime*1000000>us) break; } return nCount; }

热门招聘
相关主题

官方公众号

智造工程师