VB Timer问题:Timer Interval太慢,最小可以设多少

forcheer 2009-04-10 03:21:41
现在在做一个数字示波器,在电脑上显示由单片机传过来的数据。
用的是USB转串口,波特率3K8

在使用VB的Timer控件的时候,虽然Interval的值理论上最小可以设成1(即1KHz),但是实际上最小只能设成17(59Hz),如果Interval的值小于17的时候就会丢帧。
如果放弃Timer,使用Do While Loop,的确可以提高频率,但是用这个的话就不是等时间间隔显示

请教高手:有没有什么方法可以提高程序的刷新频率?

谢谢
...全文
2331 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
forcheer 2009-04-12
  • 打赏
  • 举报
回复
谢谢大家的帮助

现在看来把显示和接受数据分成两个线程比较好一点
forcheer 2009-04-12
  • 打赏
  • 举报
回复
谢谢大家的帮助

现在看来把显示和接受数据分成两个线程比较好一点
zdingyun 2009-04-11
  • 打赏
  • 举报
回复
摘自MSDN:
使用 Timer 控件
Timer 控件响应时间的流逝。它们独立于用户,编程后可用来在一定的时间间隔执行操作。此控件的一个一般用处是检查系统时钟,判断是否该执行某项任务。对于其它后台处理, Timer 控件也非常有用。
每个 Timer 控件都有 Interval 属性,指定定时器事件之间的毫秒数。除非禁止此属性,否则定时器在大致相等的时间间隔不断接受事件(称作定时器事件会更贴切)。
在为 Timer 控件编程时应考虑对 Interval 属性的几条限制:
如果应用程序或其它应用程序正在进行对系统要求很高的操作─ 例如长循环、高强度的计算或者正在访问驱动器、网络或端口─ 则应用程序定时器事件的间隔可能比 Interval 属性指定的间隔长。
间隔的取值可在 0 到 64,767 之间(包括这两个数值),这意味着即使是最长的间隔也不比一分钟长多少(大约 64.8 秒)。
间隔并不一定十分准确。要保证间隔准确,应在需要时才让定时器检查系统时钟,而不在内部追踪积聚的时间。
系统每秒生成 18 个时钟信号─ 所以即使用毫秒衡量 Interval 属性,间隔实际的精确度不会超过 18 分之一秒。
舉杯邀明月 2009-04-11
  • 打赏
  • 举报
回复
Timer控件的时间精度只有10ms左右(记得以前书上说是55ms)

你把 Interval 属性设置成 1,也只能得到 100Hz 的刷新率。
舉杯邀明月 2009-04-11
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 zdingyun 的回复:]
摘自MSDN:
使用 Timer 控件
Timer 控件响应时间的流逝…………
系统每秒生成 18 个时钟信号─ 所以即使用毫秒衡量 Interval 属性,间隔实际的精确度不会超过 18 分之一秒。
[/Quote]

  照这样说,Timer 控件的触发频率不会 18Hz(也许书上说的 Timer控件时间精度是55ms 就是这样来的)。但我写的代码验证结果应该是约 10ms(我也不否认 Timer控件的触发时间不精确)。

新建一个exe工程,添加两个按钮、两个Timer控件:
Option Explicit

Dim mlOutData$

Private Sub Command1_Click()
'开始
mlOutData = 0
Timer1.Enabled = True
Timer2.Enabled = True
End Sub

Private Sub Command2_Click()
'停止
Timer1.Enabled = False
Timer2.Enabled = False

End Sub

Private Sub Form_Load()

Timer1.Enabled = False
Timer2.Enabled = False
Timer1.Interval = 1000
Timer2.Interval = 5

End Sub

Private Sub Timer1_Timer()
Debug.Print Timer(), mlOutData
End Sub
Private Sub Timer2_Timer()
mlOutData = mlOutData + 1
End Sub

运行输出结果:
48320.24 98
48321.25 199
48322.25 299
48323.25 399
48324.25 499
48325.25 599
48326.25 699
48327.25 799
48328.26 899
48329.26 999
48330.26 1099
48331.26 1199
48332.26 1299
48333.26 1399
48334.27 1499
48335.27 1599
48336.27 1699
48337.27 1799


我想:Timer2每次触发时,系统不会让它连续运行 5次/6次(平均5.5次) 吧!
要真是这样运行,Timer2.Interval = 5时,干吗不让它连续运行11次呢?(得到约200Hz的效果)
嗷嗷叫的老马 2009-04-10
  • 打赏
  • 举报
回复
[Quote=引用楼主 forcheer 的帖子:]
现在在做一个数字示波器,在电脑上显示由单片机传过来的数据。
用的是USB转串口,波特率3K8

在使用VB的Timer控件的时候,虽然Interval的值理论上最小可以设成1(即1KHz),但是实际上最小只能设成17(59Hz),如果Interval的值小于17的时候就会丢帧。
如果放弃Timer,使用Do While Loop,的确可以提高频率,但是用这个的话就不是等时间间隔显示

请教高手:有没有什么方法可以提高程序的刷新频率?

谢谢
[/Quote]
数据接收由另一线程完成

显示用线程专门显示即可

你没必要用接收数据的循环来完成显示,这样当然会有影响.
limumu625 2009-04-10
  • 打赏
  • 举报
回复
1s=1000
只知道最大不能超过6万几的,难道还有下限??学习中
titron 2009-04-10
  • 打赏
  • 举报
回复
调用API函数可以定时非常小。
of123 2009-04-10
  • 打赏
  • 举报
回复

显示要考虑人眼的特性,太快是没有用的。

把你的接收缓冲区搞大一点,刷新间隔可以放慢。
东方之珠 2009-04-10
  • 打赏
  • 举报
回复
顶顶
神马都能聊 2009-04-10
  • 打赏
  • 举报
回复
按照MSDN说的是与CPU每秒生成的时钟信号个数(i)有关的,也当小于1000/i就会失真

MSDN说的i = 18
SYSSZ 2009-04-10
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 WallesCai 的回复:]
关键不在于TIMER的间隔多久,而在于你的处理过程能否在间隔时间内完成,
如果你在TIMER中处理的过程小于1毫秒,那么你设为1也可以,
如果你的处理过程需要1秒,那么不论你就不可能得到大于1赫兹的刷新

并且,因为你是在显示器上显示波型,当你的程序刷新超过显示器的刷新速度,也不可能每祯都显示出来.
[/Quote]
有理。
熊孩子开学喽 2009-04-10
  • 打赏
  • 举报
回复
关键不在于TIMER的间隔多久,而在于你的处理过程能否在间隔时间内完成,
如果你在TIMER中处理的过程小于1毫秒,那么你设为1也可以,
如果你的处理过程需要1秒,那么不论你就不可能得到大于1赫兹的刷新

并且,因为你是在显示器上显示波型,当你的程序刷新超过显示器的刷新速度,也不可能每祯都显示出来.

1,453

社区成员

发帖
与我相关
我的任务
社区描述
VB 控件
社区管理员
  • 控件
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧