CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VB >  基础类

求教:关于精确定时

楼主ScorpioBoy(ScorpioBoy)2003-09-03 13:52:08 在 VB / 基础类 提问

听说要达到ms量级的精确定时,用microsoft的timer是不行的,必须用多媒体计时器或用  
  汇编程序定时  
  我用的是vb,希望达人介绍多媒体计时器怎样加入vb,或怎样在vb中加入asm定时  
  谢谢了先  
  问题点数:0、回复次数:8Top

1 楼lihonggen0(李洪根,MS MVP,标准答案来了)回复于 2003-09-03 13:54:33 得分 0

VB编程过程中,通过引发Timer事件,Timer控件可以有规律地间隔一段时间执行一次代码。Interval属性是Timer控件最重要的一个属性,它以千分之一秒为单位指定Timer事件之间的间隔,理论上可以认为最少可设置为1毫秒触发一次Timer事件,另外一个重要属性是Enabled属性,它决定计时器是否开始工作。因为Timer控件响应时间的流逝,独立于用户,可以成为编程者的“好帮手”,所以在实践中很受欢迎,但编程者特别是初学者在实际使用过程中往往会感觉到“力不从心”,下面笔者将通过分析并结合自己的编程体会谈谈Timer控件使用中的几个误区。    
   
  1、编程中过于相信Interval属性值的准确性    
   
  这是初学者易犯的错误,其实Interval属性值只是一个参考值,其准确性低,因而间隔不一定准确。Timer控件是基于Windows消息WM_TIME的时钟脉冲发生器,系统每秒生成18个时钟信号,所以即使用毫秒衡量Interval属性,间隔的实际精度不会超过1/18秒,换句话说,Timer控件能够精确设置的最短时间是65.6毫秒,如果要使时间间隔更精确,应让定时器检查系统时钟。    
   
  2、Interval属性的取值范围    
   
  Interval属性的有效值在0至65535之间,这就意味着即使最长时间间隔也只是65.6秒,比一分钟长不了多少,而且VB只有在Interval属性值大于0时,才会产生Timer事件,这是要   特别注意的地方。    
   
  3、Timer控件的功能定位出错    
   
  Timer事件是周期性的,Interval属性主要是决定“多少次”而非“多久”,所以一般不用于计时,而是用做计数。笔者曾做过实验,把Interval值分别设为1000和60000,即把间隔时间分别设为一秒钟和一分钟,做成一个计时器,并把工作结果和系统    
   
  标。准时间比较,误差分别是6.7%和1.7%,可见定时器事件生成越频繁,响应事件所用的处理越多,越将降低系统综合性能,从而导致误差增大,这么大的误差显然失去了用做计时的意义。    
   
  4、计数器变量的声明错误    
   
  在设计计数器时最易犯的错误是不声明变量或在区域变量中声明。将Interval属性设为1000,看看下面这个程序:    
   
  Private   Sub   Timer1_timer()    
   
  Dim   i   as   integer    
  i=i+1    
   
  print   I    
   
  End   Sub    
   
  也许有读者可能想通过这段程序,能打印出1,2……n,而事实上只能打印出1,1……1来,原因在于每个时间间隔内,按顺序运行的Timer事件是彼此互不相干的,如将变量i声明为区域变量,每次程序一运行完,此变量即告完成任务,因此显示的永远是1,如在程序中将i声明为公用变量,此变量存储的值就会一直保留下来。    
   
  以上几点只是笔者在当前系统环境下的粗浅认识,可以想见,随着硬件和软件环境的不断改善,将会出现更加精确的Timer控件。    
   
  Top

2 楼lihonggen0(李洪根,MS MVP,标准答案来了)回复于 2003-09-03 13:59:00 得分 0

http://www.applevb.com/art/timing.htmTop

3 楼ScorpioBoy(ScorpioBoy)回复于 2003-09-03 13:59:19 得分 0

就是因为timer的时间不够准确我才要用其他方法阿  
   
  有什么办法能够精确到1毫秒呢??  
   
  有达人会用多媒体计时器,或知道怎样在vb中加入asm代码定时吗?Top

4 楼lihonggen0(李洪根,MS MVP,标准答案来了)回复于 2003-09-03 14:02:46 得分 0

更精确的计时  
   
  若要算到微秒,则使用GetTickCount   ,它传回Windows启动後到目前为止所经过的时间,  
  传回值以微秒为单位。  
   
  Private   Declare   Function   GetTickCount   Lib   "kernel32"   Alias   _  
                "GetTickCount"   ()   As   Long  
   
  Private   CanContinue   as   Boolean  
   
  Private   Sub   Command1_click()  
  Dim   i   as   Long  
  Dim   j   as   Long  
  i   =   GetTickCount()  
  CanContinue   =   True  
  Do   While   CanContinue  
        j   =   GetTickCount()  
        if   j   -   i   >   50   Then  
              Debug.Print   "已过50微秒"  
              i   =   j  
        End   If  
        DoEvents  
  Loop  
  End   Sub  
   
  Private   Sub   Command2_Click()  
      CanContinue   =     False  
  End   Sub    
   
   
   
  Top

5 楼lxcc()回复于 2003-09-03 14:07:34 得分 0

用GetTickCount()得到机器开机到现在的时间,再取一次,两次的间隔就是毫秒级的Top

6 楼hschx(方童)回复于 2003-09-22 17:25:18 得分 0

用windows   api   timesetevent(),较准确,事件型的不存在延时现象Top

7 楼northwolves(狼行天下)回复于 2003-09-22 21:14:03 得分 0

GetTickCountTop

8 楼James0001(虾米—什么时候成大虾?)回复于 2003-09-23 05:48:06 得分 0

API:   timeGetTime  
  API:   QueryPerformanceCount,   QueryPerformanceFrequency  
  ASM:   rdtscTop

相关问题

  • 关于精确定时,急!
  • 请教:vb的精确定时问题?
  • 如何在VB中精确定时.
  • 如何用DX来精确定时?
  • 怎样实现精确定时?
  • 如何实现精确定时?
  • 在 vc中怎样实现精确定时
  • 收集精确定时器masterz快来回答啊
  • Windows VC环境下如何实现精确的定时?
  • Timer的interval设为多少时定时是精确的。

关键词

  • 属性
  • 控件
  • 间隔
  • 误差
  • 多媒体
  • 系统
  • vb
  • 变量
  • timer
  • interval属性

得分解答快速导航

  • 帖主:ScorpioBoy

相关链接

  • Visual Basic类图书
  • Visual Basic类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo