首页 新闻 赞助 找找看

C#中的timer触发间隔的校正?

0
悬赏园豆:20 [已关闭问题] 关闭于 2010-02-06 11:46

timer触发间隔设为50ms触发一次,但实际的触发为47ms,那下一次触发就应该是53ms后…… 现在我遇到的问题时怎么判断实际触发间隔?

问题补充: 多媒体计时器 /// MMRESULT timeSetEvent( UINT uDelay, UINT uResolution, LPTIMECALLBACK lpTimeProc, WORD dwUser, UINT fuEvent )该函数设置一个定时回调事件,此事件可以是一个一次性事件或周期性事件。事件一旦被激活,便调用指定的回调函数,成功后返回事件的标识符代码,否则返回NULL。函数的参数说明如下:uDelay:以毫秒指定事件的周期。Uresolution:以毫秒指定延时的精度,数值越小定时器事件分辨率越高。缺省值为1ms。LpTimeProc:指向一个回调函数。DwUser:存放用户提供的回调数据。FuEvent:指定定时器事件类型:TIME_ONESHOT:uDelay毫秒后只产生一次事件TIME_PERIODIC :每隔uDelay毫秒周期性地产生事件。 /// 具体应用时,可以通过调用timeSetEvent()函数,将需要周期性执行的任务定义在LpTimeProc回调函数中(如:定时采样、控制等),从而完成所需处理的事件。需要注意的是,任务处理的时间不能大于周期间隔时间。另外,在定时器使用完毕后,应及时调用timeKillEvent()将之释放 /// </summary> public sealed class Timer : IComponent { private delegate void TimeProc(int id, int msg, int user, int param1, int param2); private delegate void EventRaiser(EventArgs e); [DllImport("winmm.dll")] private static extern int timeGetDevCaps(ref TimerCaps caps, int sizeOfTimerCaps); [DllImport("winmm.dll")] private static extern int timeSetEvent(int delay, int resolution, TimeProc proc, int user, int mode); [DllImport("winmm.dll")] private static extern int timeKillEvent(int id); private const int TIMERR_NOERROR = 0; private int timerID; private volatile Mode mode; public bool Enable = false; private volatile int period;//以毫秒指定事件的周期 private volatile int resolution; //以毫秒指定延时的精度,数值越小定时器事件分辨率越高。缺省值为1ms。 private TimeProc timeProcPeriodic; private TimeProc timeProcOneShot; private EventRaiser tickRaiser; private bool running = false; private volatile bool disposed = false; private IS
Bin仔的主页 Bin仔 | 初学一级 | 园豆:185
提问于:2010-01-28 09:56
< >
分享
所有回答(4)
0

0.0N秒的事情你也要操心,说明你的项目境界已经很高了。

如果真有这问题,多测试几次,是不是真的就是这么触发的(假设是吧,那就看看是不是因于代码执行了0.003秒引起的,要是真是这样,就把代码优化到0.000秒吧)

如果是测试错误,那就一切OK了

路过秋天 | 园豆:4787 (老鸟四级) | 2010-01-28 11:05
实时绘制图像…… 比如心电图 是要求有那么高的精确度的
支持(0) 反对(0) Bin仔 | 园豆:185 (初学一级) | 2010-01-28 12:28
0

System.Threading.Timer

你可以创建一个这样的后台异步的线程来校验时间.

让它和System.Windows.Form.Timer控件组合使用.

小小建议.

三阶 | 园豆:1436 (小虾三级) | 2010-01-29 10:22
0

用System.Timer.Timer或System.Threading.Timer代替Windows.Form.Timer

参考

 
杨孔来 | 园豆:262 (菜鸟二级) | 2010-01-29 14:43
起码还有些东西……
支持(0) 反对(0) Bin仔 | 园豆:185 (初学一级) | 2010-02-03 16:17
0

用System.Threading.Timer

查尔斯 | 园豆:3832 (老鸟四级) | 2010-01-30 01:25
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册