VB如何精确定时

ccbbcc 2018-12-12 02:47:49
如题,谢谢!!!!!!!!!!!!!!!!!!!!!!!!!11
...全文
358 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
ccbbcc 2018-12-15
  • 打赏
  • 举报
回复
我画图,一秒钟画一个点,然后有一个文本框,实时显示时间。画点的程序是用定时器中断方式(Private Sub Timer1_Timer())
那个文本框显示的时间是准的,可是用的是查询方式,代码如下:
second2 = timeGetTime
second = second2 - second1
second = second / 1000
可是画图需要用中断方式画,否则一直查询干不了别的事。
请问高手,如何解决?谢谢!
笨狗先飞 2018-12-15
  • 打赏
  • 举报
回复
DataArrival事件里你就该把图画出来了,或者把数据存下来,存的时候顺便把数据到达的时间也记下, 然后在Timer里,根据到达时间的情况,选择需要的数据来显示。
ccbbcc 2018-12-15
  • 打赏
  • 举报
回复
采集用的网口中断,有数据过来就触发中断。
Private Sub SckServer_DataArrival(ByVal bytesTotal As Long)
Dim MyStr As String
Dim a As Long
Dim Encoder(10) As Single
'Dim Encoder(10) As String
Dim Charnum As Integer
Dim i As Integer

'得到数据
SckServer.GetData MyStr
Charnum = Len(MyStr)
画图用定时器
Private Sub Timer1_Timer()
NWindow = N - intXMin '计算当前点位置

cx = PicDisplay.ScaleLeft + NWindow * intPixelsPerStepInX '根据当前点位置计算其在图中对应的X值
感觉VB的精度远不到15ms,我拿手机的秒表测,发现10秒钟就差了2秒
我只要精确到秒就够了。
笨狗先飞 2018-12-15
  • 打赏
  • 举报
回复
补充一下,你的代码本身的运行时间需要控制一下,Timer1_Timer()看看运行时间会不会有超过一秒的情况。
笨狗先飞 2018-12-15
  • 打赏
  • 举报
回复
引用 10 楼 ccbbcc 的回复:
我画的图有刻度。一格代表一秒,一秒走一格。准确到秒就可以。可是定时器差的太多,10秒能差两秒
精度只要求到秒的话,你直接用系统时间就可以了,定时器的定时时间设置一个小于500的数字 private sub Timer1_Timer() static s as integer if s<>second(now)then s=secnod(now) '================ '等号区里的代码就是一秒钟触发一次的。 '需要注意的就是这个Timer定时器的Interval需要小于500,时间精度要求越高,数字用的越小 '================ end if end sub
笨狗先飞 2018-12-15
  • 打赏
  • 举报
回复
引用 9 楼 ccbbcc 的回复:
我想用定时器中断,不是死循环啊。一秒钟画一个点,如果定时不准,画出来的图就不真实了。
VB精度误差15毫秒,死循环方式精度估计在1毫秒以内, 这两条是硬性的数据,如果觉得精度还是不够,那你可能用单片机来处理,误差精度是微秒级的。 数据采集就像拍照,那就是一瞬间的事情,而你要做的是尽量让这个拍照所在的时间尽可能的精确,在你所确定的时间点按下快门, 但可惜的时,由于受操作系统的限制,存在大约15毫秒的误差,注意,这个误差来自操作系统。 那该怎么办?在远大于15ms的时候就触发timer事件,在timer函数里边等待那15毫秒以后要发生的事情的到来, 这个时候,你可以把时间控制精度提高到1毫秒左右,这个精度受语言和操作系统的影响。时间到了之后,拍照采集,然后结束函数。 这种控制方式大约会有20毫秒左右的卡顿,然后可能还要包括你采集数据需要花费的时间,其实这段时间这么短眼睛是不容易看出来的, 需要再高的时间精度的话,建议还是用单片机来处理了,吃力不讨好。
ccbbcc 2018-12-15
  • 打赏
  • 举报
回复
我画的图有刻度。一格代表一秒,一秒走一格。准确到秒就可以。可是定时器差的太多,10秒能差两秒
ccbbcc 2018-12-15
  • 打赏
  • 举报
回复
我想用定时器中断,不是死循环啊。一秒钟画一个点,如果定时不准,画出来的图就不真实了。
笨狗先飞 2018-12-15
  • 打赏
  • 举报
回复
1秒钟时间够你整个屏幕大小的场景上画20遍了。 画图的规则是先清空,再全画上,等待,然后再清空,再重画,再等待,再清空,再重画。。。 这才是定时器该干的事,再画图的同时,你还可以顺带把时间更新了。 然后,遇到的问题是画面会闪烁。。。 接下来你研究一下双缓冲, 先把图画在一个不可见的picture上,画完之后,整个覆盖到你当前显示图画的那个picture上,这样就不闪了。。。 用doevents的后果就是很有可能程序需要在退出时候用end语句来结束。
舉杯邀明月 2018-12-15
  • 打赏
  • 举报
回复

要不,你就试试在你的“轮询”时间的循环中,插入1条甚至多条 DoEvents 语句。
舉杯邀明月 2018-12-15
  • 打赏
  • 举报
回复
1. “定时器”就根本无法保证“精确时间间隔”,你那个“精确时间”有多大意义?

2. timeGetTime理论上的“最高精度”也是1ms(实际肯定没这么高),
  也就是最多1000次/秒的变动。
  而你却用什么“死循环轮询”来更新显示?
  那你想想每秒会“更新”多少次了?有这必要吗…………

ccbbcc 2018-12-15
  • 打赏
  • 举报
回复
什么意思?请大侠明示
舉杯邀明月 2018-12-15
  • 打赏
  • 举报
回复
你的“设计模式”可能不正确。


脆皮大雪糕 2018-12-12
  • 打赏
  • 举报
回复
问题是你要求精确到什么程度? 你的应用场景是啥? 个人认为定时到毫秒级意义不大,定时到了以后函数的调用啥的可能都要个几毫秒了。 定到秒级的,只要用自带的定时器在百毫秒级的频率检查系统时间,就能基本达到 定到百毫秒级的用sleep也行了。
笨狗先飞 2018-12-12
  • 打赏
  • 举报
回复
https://download.csdn.net/download/xljdycc/3230958 如题,谢谢!!!!!!!!!!!!!!!

7,785

社区成员

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

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