当前位置:编程学习 > VB >>

想用VB做延时,延时时间要小于ms级,看来看去都是timer,sleep,没有更小的了吗?

如题,请高手指教 --------------------编程问答--------------------
一:
Private Declare Sub Sleep Lib "kernel32.dll" (ByVal dwMilliseconds As Long)
调用:Sleep 15
二:
Private Declare Function GetTickCount Lib "kernel32" () As Long
Private Sub DelayCycle(Optional Dtm As Long)
Dim StartTm&
    StartTm = GetTickCount
    Do
    DoEvents
    Loop Until GetTickCount >= StartTm + Dtm
End Sub
调用:Call DelayCycle(15)
--------------------编程问答-------------------- 没有,去看看工控产品,有的板卡带定时器 --------------------编程问答-------------------- 貌似没有更小的了 --------------------编程问答--------------------
Declare Function QueryPerformanceFrequency Lib "kernel32" (lpFrequency As LARGE_INTEGER) As Long
Declare Function QueryPerformanceCounter Lib "kernel32" (lpPerformanceCount As LARGE_INTEGER) As Long
Type LARGE_INTEGER
    LowPart As Long
    HighPart As Long
End Type

'实现毫秒量级精确延时,(n 毫秒)
Public Sub Wait(ByVal n As Long)
    Dim PFrequency As LARGE_INTEGER
    Dim Interval As LARGE_INTEGER
    Dim Privious As LARGE_INTEGER
    Dim Current As LARGE_INTEGER
    '获得高精度计数器的频率
    QueryPerformanceFrequency PFrequency
    '获得高精度运行计数器的值
    QueryPerformanceCounter Privious
    Current = Privious
    Interval.LowPart = Abs((PFrequency.LowPart / 10000) * n)
    '下面这句可以精确到微秒,好像不太实用,也未必精确到如此地步
    'Interval.LowPart = (PFrequency.LowPart / 1000000) * n
    Interval.HighPart = 0
    '通过比较两次计数器的值差实现高精度延时
    Do While (Abs(Current.HighPart * 2 ^ 16) + Current.LowPart) - _
             (Abs(Privious.HighPart * 2 ^ 16) + Privious.LowPart) < _
             (Abs(Interval.HighPart * 2 ^ 16) + Interval.LowPart)
        QueryPerformanceCounter Current
        '此句若省略,循环期间其它事就都不能做了
        DoEvents
    Loop
End Sub
--------------------编程问答-------------------- 不会。帮你顶下!长期不会。帮你顶下!长期关注中!期待最佳答案! --------------------编程问答--------------------
引用 4 楼 dbcontrols 的回复:
VB code
Declare Function QueryPerformanceFrequency Lib "kernel32" (lpFrequency As LARGE_INTEGER) As Long
Declare Function QueryPerformanceCounter Lib "kernel32" (lpPerformanceCount As LARGE_INTEGER)……


你确定你的写法正确吗?为什么要* 2 ^ 16 啊?Long不是0 - 2^31 -1 的吗??
--------------------编程问答-------------------- 有问题的话开帖子问,别在别人帖子里问

引用 6 楼 wowfiowow 的回复:
引用 4 楼 dbcontrols 的回复:

VB code
Declare Function QueryPerformanceFrequency Lib "kernel32" (lpFrequency As LARGE_INTEGER) As Long
Declare Function QueryPerformanceCounter Lib "kernel32" (lpPerforma……
--------------------编程问答--------------------
引用 7 楼 dbcontrols 的回复:
有问题的话开帖子问,别在别人帖子里问

引用 6 楼 wowfiowow 的回复:
引用 4 楼 dbcontrols 的回复:

VB code
Declare Function QueryPerformanceFrequency Lib "kernel32" (lpFrequency As LARGE_INTEGER) As Long
Declare Function Quer……


问什么啊,你那写的根本就是错的,应该除1000,你除10000了,自己测试下就知道了
还有这个我以前小研究过一点,他的lowpart是从0到2^32-1然后再减少到0然后highpart+1
如果光判断2个时间的差,你就会遇到个问题,如果对方wait后面一个极大的数比如几十分钟,你就会发现你的调用是错的
你的写法至少有这2个错误,还想要分?算了吧! 挺反感你这样的人,分那么重要?说话这么冲 ! --------------------编程问答-------------------- --------------------编程问答-------------------- 这种延时精度真能达到1ms吗,是分辨率1ms吧 --------------------编程问答-------------------- 彼此彼此,早就挺反感你这样的人
不相信的话你可以遍查我的回复,从来没搭理你

引用 8 楼 wowfiowow 的回复:
引用 7 楼 dbcontrols 的回复:

有问题的话开帖子问,别在别人帖子里问

引用 6 楼 wowfiowow 的回复:
引用 4 楼 dbcontrols 的回复:

VB code
Declare Function QueryPerformanceFrequency Lib "kernel32" (lpFrequency As LARGE_INTEGER) As Lo……
--------------------编程问答-------------------- 没错,就这2个函数。
可不可以搬个凳子看热闹?


卖爆米花啦。。。。。。 --------------------编程问答-------------------- 毫秒级已经很小了,只要能做到精确,足矣。 --------------------编程问答-------------------- 应用程序级的所谓定时要很精确要看概率的,如果要小于毫秒,就是说微妙或纳秒级的测量,
其实现在的PC可以随便做到,毕竟CPU的频率很高。
如果要做这类事情建议做驱动程序调用CPU定时器中断来操作就比较准确。否则光是靠应用程
序来循环判断,不一定能得到准确的东西。比如你正在运行你的定时程序,但突然启动了另外
一个程序在做比较大量数据的串口和网络通讯,而且那个程序占用的CPU资源也非常高,时常
100%的CPU占用率,这时候你会发现你的定时器不见得准确了。因为串口和网络的驱动层高于
你应用程序的优先级,他们在繁忙工作的时候,应用程序必须靠边站。
所以驱动程序用CPU中断来处理可以做到比较精确和稳定的处理。 --------------------编程问答-------------------- 我一直用SLEEP,等待答案。。。。。 --------------------编程问答-------------------- 重新审查需求,是不是真的要那么高的精度 --------------------编程问答-------------------- 巨耗CPU 没任何实用价值哦 --------------------编程问答-------------------- 而且你考虑了CPU时间片的问题没有?ms已经是非常精确的了  --------------------编程问答-------------------- ms搞不定。

因为cup时间片就是16毫秒。咋整嘛!

估计搞定了也是硬件层面的。我不懂,乱说,大家别扔板砖。 --------------------编程问答-------------------- 使用timegettime函数能达到1ms的精度
Private Declare Function timeGetTime Lib "winmm.dll" () As Long

Private Sub Form_Load()
Dim i As Long
i = timeGetTime
Do
    If timeGetTime - i >= 5 Then
    Debug.Print timeGetTime
    i = timeGetTime
    End If
    DoEvents
Loop
End Sub
--------------------编程问答--------------------
Option Explicit
Private Declare Function timeGetTime Lib "winmm.dll" () As Long

Private Sub Form_Click()
Dim i As Long, l As Long
i = timeGetTime
l = i
Do
    If timeGetTime - i >= 1 Then
    Debug.Print timeGetTime
    i = timeGetTime
    If timeGetTime - l >= 20 Then Exit Do '测试20ms内的输出数量
    End If
    DoEvents
Loop
End Sub
--------------------编程问答-------------------- 不知道楼主用在什么上面需要这么高的频率. --------------------编程问答-------------------- 没有小于毫秒级的,VB恐怕是做不到了,去求助其他语言吧! --------------------编程问答--------------------
引用 23 楼 mokton 的回复:
没有小于毫秒级的,VB恐怕是做不到了,去求助其他语言吧!

C --------------------编程问答-------------------- 什么程序要这么精确?做什么实时数据的? --------------------编程问答-------------------- 如果是做实时数据采集,完全可以利用下位机的触发计时,软件设计计时,一般达到ms级足够了。应该考虑CPU的时序
--------------------编程问答-------------------- 不知道大家有没有见过用PC声卡当波形采集做示波器的程序,如果这样的运用,毫秒可以说是很大的单位,通常都会玩到微妙或纳秒级的单位。有这种毫秒以下的单位需求,其实很正常的。
补充:VB ,  基础类
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,