Windows 下精确定时 点击:602 | 回复:8



TellTruth

    
  • 精华:1帖
  • 求助:0帖
  • 帖子:10帖 | 451回
  • 年度积分:0
  • 历史总积分:1302
  • 注册:2003年10月29日
发表于:2011-05-31 16:39:02
楼主

已经好几次讨论这个问题了,Windows是非实时的。所以精确也高不到哪儿去,但是每两次的间隔时间很准确。

如果坚持要用它来精确定时。

程序的代码步骤如下。

使用timeSetEvent建立以个MM定时器,返回的是定时器的ID。timeSetEvent参数中有一个回调函数TimerProc(当然你可以用别的名字)就是周期性执行的函数。在这个函数体内执行你需要的代码。代码不要有等待等操作,而且执行时间要短(不要超过10ms)现在X86计算机Windows操作系统任务调度时间间隔为15.7ms左右(外频是33MHz整数倍的CPU,如果是100MHz整数倍可能是10ms)。

使用完定时后使用timeKillEvent关闭这个timer。

例子如下:

mTimer = timeSetEvent(20, 1, TimerProc,  (DWORD)pParam, TIME_PERIODIC);

...

DWORD TimerProc(...)

{

//采集数据或者DAC输出

}

...

timeKillEvent(mTimer); 




braverider

  • 精华:0帖
  • 求助:0帖
  • 帖子:9帖 | 119回
  • 年度积分:0
  • 历史总积分:546
  • 注册:2005年7月28日
发表于:2011-05-31 16:57:54
1楼

这是多媒体定时器,它的定时精度可以做到ms级。

TellTruth

  • 精华:1帖
  • 求助:0帖
  • 帖子:10帖 | 451回
  • 年度积分:0
  • 历史总积分:1302
  • 注册:2003年10月29日
发表于:2011-06-01 14:31:57
2楼

我测试过多台计算机(办公用)对于125ms整数倍定时总是很准(如125,250,500,1000),抖动不超过0.1ms。而对于其他的时间间隔抖动甚至到1ms(即使是25,50,75也不行)。

~小虫~

  • 精华:0帖
  • 求助:2帖
  • 帖子:19帖 | 307回
  • 年度积分:0
  • 历史总积分:659
  • 注册:2007年2月02日
发表于:2011-06-01 16:47:08
3楼

你没测带负载的情况,这里负载是指CPU的负载

建议你直接用RTX,多媒体也好,多线程也好,中断也好,都不太可靠

军工仿真大都用RTX

不过正版的RTX比较贵,得几万美金,网上有D版的下。

TellTruth

  • 精华:1帖
  • 求助:0帖
  • 帖子:10帖 | 451回
  • 年度积分:0
  • 历史总积分:1302
  • 注册:2003年10月29日
发表于:2011-06-01 16:52:05
4楼
那儿有D版的RTX,我原来一直用的是Eval版,一个月后就完蛋。幸亏是自己用来试验,没用于项目。

braverider

  • 精华:0帖
  • 求助:0帖
  • 帖子:9帖 | 119回
  • 年度积分:0
  • 历史总积分:546
  • 注册:2005年7月28日
发表于:2011-06-01 17:35:35
5楼
引用TellTruth 的回复内容:

我测试过多台计算机(办公用)对于125ms整数倍定时总是很准(如125,250,500,1000),抖动不超过0.1ms。而对于其他的时间间隔抖动甚至到1ms(即使是25,50,75也不行)。



请问你是用什么方法测试的?

~小虫~

  • 精华:0帖
  • 求助:2帖
  • 帖子:19帖 | 307回
  • 年度积分:0
  • 历史总积分:659
  • 注册:2007年2月02日
发表于:2011-06-01 17:46:58
6楼

CSDN下载频道有,搜索Ardence

http://download.csdn.net/source/2694471  

TellTruth

  • 精华:1帖
  • 求助:0帖
  • 帖子:10帖 | 451回
  • 年度积分:0
  • 历史总积分:1302
  • 注册:2003年10月29日
发表于:2011-06-02 12:25:22
7楼
测试的方法很简单。用QueryPerformanceCounter。

~小虫~

  • 精华:0帖
  • 求助:2帖
  • 帖子:19帖 | 307回
  • 年度积分:0
  • 历史总积分:659
  • 注册:2007年2月02日
发表于:2011-06-02 17:09:00
8楼

也可以这样:

__asm rdtsc;


热门招聘
相关主题

官方公众号

智造工程师