vb是否有个等待的函数?

dickins 2008-03-13 11:54:48
我想实现的是:
当程序运行到这段代码的时候,等待5秒再继续往下走。
请问,vb中有这样的函数吗? 没有的话,api函数可以实现吗?
...全文
476 点赞 收藏 26
写回复
26 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
Albert韩 2008-03-20
Vb有个时间空间,它能实现你的要求
回复
cqcpl 2008-03-20
有好多种方法呢。
1。利用Sleep
这需要引用API,缺点是那5秒种等待基本就是假死状。建议不要用。
2。利用GetTickCount
需要引用API,结合DoEvents后,没有假死的缺点,非常好用。但精确度不是很高。有十来毫秒的误差。
3。利用now函数。它返回当前的系统时间。
这里可不用API,但精确更差。
4。利用1到2个时钟控件,加上复杂的控制变量。
最垃圾的一种。但我初学之时就用它。因为我只知道时钟控件里可以控制时间。
回复
tingting1123 2008-03-17
/*记号*/
回复
shakoe 2008-03-17
我们在跨小时的情况下计算时间偏移用以下代码来解决

应用了VB的NOW对象,对其中的分和小时位加权,转换成秒来计算。


Public Sub MySleep(Delaytm&)
Dim Starttm as long
Starttm = Left(Right(Format(Now, "MMDDHHMMSS"), 4), 2) * 3600+ Left(Right(Format(Now, "MMDDHHMMSS"), 4), 2) * 60 + Right(Format(Now, "MMDDHHMMSS"), 2)

Do
DoEvents
Loop Until (Left(Right(Format(Now, "MMDDHHMMSS"), 4), 2) * 3600+ Left(Right(Format(Now, "MMDDHHMMSS"), 4), 2) * 60 + Right(Format(Now, "MMDDHHMMSS"), 2)- Starttm) > Delaytm
End Sub


就是



回复
c51profanss 2008-03-17
[Quote=引用 17 楼 Chen8013 的回复:]
引用 16 楼 c51profanss 的回复:
循环的确不太准确,而且用循环的话也不用timer那么麻烦吧,貌似直接用now()函数替代timer就行


Timer() 比 Now() 多两个字母,就“麻烦”了???
再说,一般是说“暂停”多少秒,而 Now() 返回的单位是“天”,你还得去换算,才知0.000……nnnn才是一秒,究竟哪个麻烦???
[/Quote]
Now()返回的是天???老兄,自己写写程序再说!
回复
舉杯邀明月 2008-03-17
[Quote=引用 21 楼 c51profanss 的回复:]
引用 17 楼 Chen8013 的回复:
引用 16 楼 c51profanss 的回复:
循环的确不太准确,而且用循环的话也不用timer那么麻烦吧,貌似直接用now()函数替代timer就行


Timer() 比 Now() 多两个字母,就“麻烦”了???
再说,一般是说“暂停”多少秒,而 Now() 返回的单位是“天”,你还得去换算,才知0.000……nnnn才是一秒,究竟哪个麻烦???

Now()返回的是天???老兄,自己写写程序再说!
[/Quote]

  这位大哥,我用VB/VBA还是有几年了,我倒想问问你,你自己去“深入”过Now()函数没有?
  话说得太多毫无意义,你可以试一下:
Debug.Print Now(), Now() + 0.5
  你仔细看一下打出来的结果,是不是刚好相差12小时???
回复
哈哈,楼上这一说,我倒想起去年做的一个定时器了:)

楼主可以看看:

http://topic.csdn.net/u/20071229/13/6efd2742-d161-436b-bc94-f70c5f88aa81.html
回复
nik_Amis 2008-03-15

GetTickCount,timeGetTime比Sleep更精确,如果一般应用Sleep(1000*5)就行了


虽然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等

回复
cutestar 2008-03-15
用个timer控件

Private Sub Command1_Click()
Debug.Print Now
MySleep 5000
Debug.Print Now
End Sub

Private Sub MySleep(ByVal ms As Integer)
bSleep = True
Timer1.Interval = ms
Timer1.Enabled = True
Do
DoEvents
Loop While bSleep
End Sub

Private Sub Timer1_Timer()
Timer1.Enabled = False
bSleep = False
End Sub
回复
舉杯邀明月 2008-03-15
[Quote=引用 16 楼 c51profanss 的回复:]
循环的确不太准确,而且用循环的话也不用timer那么麻烦吧,貌似直接用now()函数替代timer就行
[/Quote]

  Timer() 比 Now() 多两个字母,就“麻烦”了???
  再说,一般是说“暂停”多少秒,而 Now() 返回的单位是“天”,你还得去换算,才知0.000……nnnn才是一秒,究竟哪个麻烦???
回复
c51profanss 2008-03-14
循环的确不太准确,而且用循环的话也不用timer那么麻烦吧,貌似直接用now()函数替代timer就行
回复
nik_Amis 2008-03-14
不要用循环,不准确也消耗资源
API:Sleep比较好,你如果要更精确的,可以查查老帖子,我记得有人说过
回复
舉杯邀明月 2008-03-14
不小心按错键了,是“连续49.71天的时间”
回复
舉杯邀明月 2008-03-14
  用GetTickCount()要安全一些,毕竟它可以表示连续47.71天的时间。我想除了服务器,一般的机器不可能连续这么长时间不关机。但不可能说:我们的程序在某某特定的时刻不能执行某某操作呀。
回复
cbm6666 2008-03-14
这主要是看你的用途而定.

TIMER跨日当然从0起算, 在有跨日的用途上TIMER是不能用的, 可以使用GetTickCount

Private Declare Function GetTickCount& Lib "kernel32" ()
Private WithEvents Timer1 As Timer
Dim Starttm&, Settime&

Private Sub Form_Load()
Set Timer1 = Controls.Add("VB.Timer", "Timer1")
Timer1.Interval = 100
Timer1.Enabled = False
End Sub

Private Sub Command1_Click()
Starttm = GetTickCount
Settime = 5
Timer1.Enabled = True
End Sub

Private Sub Timer1_Timer()
Me.Caption = CStr(Int((GetTickCount - Starttm) \ 1000)) & " 秒"
If Val(Me.Caption) >= Settime Then MsgBox "计时终止!": Timer1.Enabled = False
End Sub

回复
舉杯邀明月 2008-03-14
[Quote=引用 10 楼 cbm666 的回复:]
Sorry 笔误

Loop Until Timer - Starttm > = Delaytm
[/Quote]

向这位大师请教一下:

  假设 Deaytm = 3 ,如果在 23:59:59 的时候执行 Call MySleep(3),会是什么结果呢?
回复
zzyong00 2008-03-13
晕...
回复
zzyong00 2008-03-13
用sleep也行,但是,对于有界面的程序不太合适,因为sleep时,界面没有响应
也可以自己写一个

sub delay ( t as long)
dim tS as long
tS=timer
do
if timer-tS>=t then exit do
doevents
loop
end sub
回复
tmd007 2008-03-13
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Private Sub Command1_Click()
Command1.Caption = "请等待5秒..."
Command1.Enabled = False
DoEvents
Sleep (5000)
Command1.Enabled = True
Command1.Caption = "嘿嘿"
End Sub
回复
forbearORfolie 2008-03-13
sub delay(delaytime as single)
dim start
start=timer
do while delaytime>timer-start
doevents
loop
end sub
回复
加载更多回复
相关推荐
发帖
VB基础类
创建于2007-09-28

7518

社区成员

VB 基础类
申请成为版主
帖子事件
创建了帖子
2008-03-13 11:54
社区公告
暂无公告