注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Slow.More√BLOG

Fast?

 
 
 

日志

 
 

timeGetTime  

2008-06-18 22:56:20|  分类: 编程 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

timeGetTime

2007-12-28 10:35

利用 timeGetTime 更精准地计算时间差

我想每 0.005 秒做某一件工作, 所以撰写了以下程序:

Dim tm1 As Single

Do

tm1 = Timer

While Timer - tm1 < 0.005 ' 等于 0.005 秒

DoEvents

Wend

...做某一件工作

Loop

但实际上, 在 While 循环里面, Timer 函数几乎每次都得到相同的时间,只有

大约隔了 0.05秒才会得到不同的时间, 也就是说 Timer 的准确性只有 0.05 秒,

但我希望进行的工作却是每 0.005 秒一次, 该怎么办呢?

可以改用 Windows API 的 timeGetTime 函数, 此一函数会传回 Windows 开机以

来所经过的时间,时间单位是 1/1000 秒, 举例来说, 开机经过 2 分钟, 则传

回值等于 2*60*1000, timeGetTime 的优点是时间可以精确到 1/1000 秒, 所以

可以用来解决上述的问题,细节如下:

1. API 的声明:

Private Declare Function timeGetTime Lib "winmm.dll" Alias "timeGetTime"

() As Long

注:如果以上的声明放在「一般模块」底下, 应将 Declare 之前的 Private 保

留字去掉。

2. 程序范例:

Dim tm1 As Long

Do

tm1 = timeGetTime

While timeGetTime - tm1 < 5 ' 等于 5/1000 = 0.005 秒

DoEvents

Wend

...做某一件工作

Loop

timeGetTime函数延时不准

     操作系统: Win2000

     编程工具: VB6

     问题: 我利用timeGetTime函数,做了一个延时函数,如下:

    Private Sub DelayTime(ByVal DelayNum As Long)

     Dim StartTime As Double, TmpTime As Single

    

     StartTime = timeGetTime

     Do

     TmpTime = timeGetTime

     If TmpTime < StartTime Then StartTime = TmpTime

     Loop Until (TmpTime - StartTime) >= DelayNum

    End Sub

    

     但是,延时不准!有时候有10几毫秒的误差!请问我的程序写的有问题吗?如何改正?

     水平: 中级(王辉)

     虽然timeGetTime返回值的单位是1ms,但实际上它的精度只有10ms左右。

     如果想提高精度,可以使用QueryPerformanceCounter和QueryPerformanceFrequency。这两个函数不是在每个系统中都支持。对于支持它们的系统中,可以获得低于1ms的精度。Windows 内部有一个精度非常高的定时器, 精度在微秒级, 但不同的系统这个定时器的频率不同, 这个频率与硬件和操作系统都可能有关。利用 API 函数 QueryPerformanceFrequency 可以得到这个定时器的频率。利用 API 函数 QueryPerformanceCounter 可以得到定时器的当前值。根据要延时的时间和定时器的频率, 可以算出要延时的时间定时器经过的周期数。在循环里用 QueryPerformanceCounter 不停的读出定时器值, 一直到经过了指定周期数再结束循环, 就达到了高精度延时的目的。例如:

    Private Declare Function QueryPerformanceCounter Lib "kernel32" (lpPerformanceCount As Currency) As Long

    Private Declare Function QueryPerformanceFrequency Lib "kernel32" (lpFrequency As Currency) As Long

    

    ' DelayNum为延时的毫秒数

    Private Sub DelayTime(ByVal DelayNum As Long)

     Dim Ctr1, Ctr2, Freq As Currency

     Dim Count As Double

    

     If QueryPerformanceFrequency(Freq) Then

     QueryPerformanceCounter Ctr1

     Do

     QueryPerformanceCounter Ctr2

     Loop While (Ctr2 - Ctr1) / Freq * 1000 < DelayNum

     Else

     MsgBox "不支持高精度计数器!"

     End If

    End Sub

    

     不过,Windows不是实时操作系统,如果任务太多,或者有其他中断请求,都可能导致程序运行时的延迟不精确,一般的Windows程序也可以接受。如果你对时间精度要求很高,一般只有使用Windows的实时扩展RTX,或者使用其他实时操作系统,如VXWorks等。

  评论这张
 
阅读(2110)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018