首页 新闻 会员 周边 捐助

c#中想做个循环周期在1ms左右的定时器,能做到吗?特急~~

0
悬赏园豆:100 [已解决问题] 解决于 2010-12-08 22:08

我现在想用C#做个循环周期取数、存数的程序,试了C#中的三个常规定时器,虽然上边的时间精度最小是1ms,但是其实是达不到的,要想保证时间精度在1ms左右,能有方法实现吗?用什么方法,求助高手,实在是逼到最后了.....

勇勇0474的主页 勇勇0474 | 初学一级 | 园豆:50
提问于:2010-11-22 15:36
< >
分享
最佳答案
0

windows 的调度时间片是 15ms, 而且windows 不是实时操作系统,所以用传统的定时器是根本无法达到1ms 的精度的。10ms 的精度都达不到。windows 下要实现高精度定时器,需要用多媒体定时器才可以。

看下面文章,你把C++的代码改成 C#就可以了。

http://blog.csdn.net/akumas/archive/2010/06/30/5703366.aspx

还有这篇文章,你也可以参考一下

http://blog.chinaunix.net/u2/75161/showart_1103212.html

收获园豆:20
eaglet | 专家六级 |园豆:17139 | 2010-11-23 07:50
这个我看了一下,如果改了的话,能变成循环执行的功能吗?或者说是得到类似于timer.Interal的属性来进行事件周期的设置?
勇勇0474 | 园豆:50 (初学一级) | 2010-11-23 17:34
C#能不能实现类似VC的多媒体定时器功能???
勇勇0474 | 园豆:50 (初学一级) | 2010-11-24 01:19
因为C++做数据库的部分不如C#
勇勇0474 | 园豆:50 (初学一级) | 2010-11-24 01:20
C# 当然可以实现多媒体定时器功能,那个功能又不是VC的,是windows系统提供的,你只要调用相应的API就可以做到
eaglet | 园豆:17139 (专家六级) | 2010-11-25 04:00
其他回答(4)
0

当然可以,直接用Timer就可以,你可一试!

收获园豆:20
Tester Chen | 园豆:1690 (小虾三级) | 2010-11-22 15:37
它的最小单位就是1ms
支持(0) 反对(0) Tester Chen | 园豆:1690 (小虾三级) | 2010-11-22 15:37
这个.....如果你说的是timer控件是不行的,虽然它标定的是1ms,但是达不到,用过了就知道了
支持(0) 反对(0) 勇勇0474 | 园豆:50 (初学一级) | 2010-11-22 15:45
应该是可以的,我正在试
支持(0) 反对(0) Tester Chen | 园豆:1690 (小虾三级) | 2010-11-22 15:47
试完了吗??结果怎么样?
支持(0) 反对(0) 勇勇0474 | 园豆:50 (初学一级) | 2010-11-22 16:08
通过我的试验,现在我有两个问题:①你的事件触发没有; ②是否一直执行事件
支持(0) 反对(0) Tester Chen | 园豆:1690 (小虾三级) | 2010-11-22 16:10
事件肯定是触发了,执行的事件是存数的程序。每触发一次,存一组,timer设置成1ms了,但现在存十秒钟也就能存600多组数吧,一秒60多组
支持(0) 反对(0) 勇勇0474 | 园豆:50 (初学一级) | 2010-11-22 16:20
如果是现在的情况,我觉得应该是楼下所说的原因,因为你机器配置的原因,在1ms的时间内,来不及执行完你的操作并来进行下一步的操作。你可以试一下把周期改成20ms,如果添加数据正确,则说明,是上述原因
支持(0) 反对(0) Tester Chen | 园豆:1690 (小虾三级) | 2010-11-22 16:27
哦,那就没有办法能提高了吗???看到一些实时采集软件都能到达1000hz的,虽然有可能是理论值,但是存下来的数至少也得有600hz吧
支持(0) 反对(0) 勇勇0474 | 园豆:50 (初学一级) | 2010-11-22 16:29
如果你把周期改完之后,它存储的数据组数是正确的,那么说明程序没有问题;如果有问题,只能说它与理论不符合,而这不符合的原因,是因为机器的配置或程序实现的方式有问题(即程序性能不高或机器配置跟不上)
支持(0) 反对(0) Tester Chen | 园豆:1690 (小虾三级) | 2010-11-22 16:33
估计是程序的问题,所以看看会不会有更高的手能解决这个问题,10ms跟1ms的数据从波形上来看是没大差别的,配置应该没问题吧,双核,2G内存,应该不会有如此的差距吧
支持(0) 反对(0) 勇勇0474 | 园豆:50 (初学一级) | 2010-11-22 16:39
可能这种实现方式,它的性能有问题,得换一种方法
支持(0) 反对(0) Tester Chen | 园豆:1690 (小虾三级) | 2010-11-22 16:50
你看你更新数据的算法,有没有优化的余地?
支持(0) 反对(0) Tester Chen | 园豆:1690 (小虾三级) | 2010-11-22 16:50
不是网上好多说,API中的两个函数可以到纳秒吗?
支持(0) 反对(0) 勇勇0474 | 园豆:50 (初学一级) | 2010-11-22 17:34
Win32 API 使用 QueryPerformanceCounter() 和 QueryPerformanceFrequency() 方法支持高精度计时。网上就是说这两个函数,但是我不会用
支持(0) 反对(0) 勇勇0474 | 园豆:50 (初学一级) | 2010-11-22 19:07
在这篇文章中有我们前面讲到的你的程序周期达不到的原因及另一个解决办法:http://hi.baidu.com/wlw7758/blog/item/b9cd8754e0b9e2113a2935c3.html
支持(0) 反对(0) Tester Chen | 园豆:1690 (小虾三级) | 2010-11-23 08:22
0

达不到的原因也可能是你的处理超过了1ms。一般是没问题的

收获园豆:20
茂茂 | 园豆:2898 (老鸟四级) | 2010-11-22 15:51
timer控件Tick事件每发生一次,执行一次12个通道的取数跟存数,程序试过了啊,你也可以试试
支持(0) 反对(0) 勇勇0474 | 园豆:50 (初学一级) | 2010-11-22 15:55
不是网上好多说,API中的两个函数可以到纳秒吗?
支持(0) 反对(0) 勇勇0474 | 园豆:50 (初学一级) | 2010-11-22 17:34
0

不知道楼主想干什么。实际上说是可以精确到1ms,但是系统不能单处理你一个程序,如果其他东西就超过了1ms,

你的这个精度当然要超过1ms,实际上每隔多长时间,也不一定就是那个时间,每个都是那么长时间应该是做不到的。

收获园豆:20
顾晓北 | 园豆:10898 (专家六级) | 2010-11-22 16:53
就是一个循环tick取数,并与数据库存数的程序,不是网上好多说,API中的两个函数可以到纳秒吗?
支持(0) 反对(0) 勇勇0474 | 园豆:50 (初学一级) | 2010-11-22 17:33
没听说过,但即使是理论上可以到纳秒,但是实际上呢?不说cpu要处理其他指令,光说硬盘存取有那么快吗?所以实际上应该是不容易达到那么精确的,楼主这个没什么实际意义吧?
支持(0) 反对(0) 顾晓北 | 园豆:10898 (专家六级) | 2010-11-22 17:48
有,因为后边的算法跟波形要保持一致,不能失真,就要保持频率是算法要求频率的两倍。而且很多数据采集并实时显示软件,我看都能达到至少500hz
支持(0) 反对(0) 勇勇0474 | 园豆:50 (初学一级) | 2010-11-22 19:06
Win32 API 使用 QueryPerformanceCounter() 和 QueryPerformanceFrequency() 方法支持高精度计时。网上就是说这两个函数
支持(0) 反对(0) 勇勇0474 | 园豆:50 (初学一级) | 2010-11-22 19:07
但是我不会用啊
支持(0) 反对(0) 勇勇0474 | 园豆:50 (初学一级) | 2010-11-22 19:08
那你查查怎么用API吧。
支持(0) 反对(0) 顾晓北 | 园豆:10898 (专家六级) | 2010-11-23 08:46
0

精度达不到,15-20ms才会触发一次。

收获园豆:20
甲_乙_丙_丁 | 园豆:804 (小虾三级) | 2010-11-23 14:32
就是这个现象,现在想问问有没有解决方案达到更高精度,更短周期
支持(0) 反对(0) 勇勇0474 | 园豆:50 (初学一级) | 2010-11-23 17:35
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册