VB Sleep垃圾等待函数
本帖最后由 tk600158 于 2010-09-21 16:45:24 编辑 其实主要是一个关于SLEEP的问题。
SLEEP使用后则程序就处于一个全局停顿状态,程序不会接受任何新事件。所以我一直感觉SLEEP确实是一个很垃圾的等待函数。
'所以多数情况下在VB过程中等待我是这么写的
DO
Doevents
if XXX then exit do
LOOP
'但是一般这样使用循环会超占CPU,所以后来改为这样
DO
Doevents
Sleep 1
LOOP
'但是我感觉效果也不好,因为SLEEP总会去让其他事件也停止响应。
'我只想这样
DO
'在过程中不费CPU,不会影响本程序其他时间的产生的等待上1秒钟,这样也不行么?
if XXX then exit do
LOOP
function StartFun()
timer1.tag="1"
timer1.interval=1000 '延时1秒
timer1.enabled=true
end function
function Fun1()
timer1.tag="2"
timer1.interval=1000 '延时1秒
timer1.enabled=true
........code......
end function
function Fun2()
timer1.tag="3"
timer1.interval=1000 '延时1秒
timer1.enabled=true
........code......
end function
function Fun3()
timer1.tag="0" '这里可以跳回1,随便怎么做都行
timer1.enabled=false
........code......
end function
private sub timer1_timer()
timer1.enabled=false
select case timer1.tag
case "1"
call fun1
case "2"
call fun2
case "3"
call fun3
end select
end sub
Private Declare Sub Sleep Lib "Kernel32" (ByVal dwMilliseconds As Long) '声明
Private Declare Function GetTickCount Lib "kernel32" () As Long
Private Sub Command1_Click()
Dim STime1 As Long
Dim STime2 As Long
STime1 = GetTickCount
VB_Sleep 1000
STime2 = GetTickCount
MsgBox STime1 & " - " & STime2
End Sub
Private Sub VB_Sleep(ByVal dwMilliseconds As Long)
Dim SaveTime As Long
Dim NowTime As Long
Dim IsWait As Long
IsWait = 0
SaveTime = GetTickCount
Do
DoEvents
NowTime = GetTickCount
If NowTime - SaveTime >= dwMilliseconds Then
IsWait = 1
End If
Loop While IsWait = 0
End Sub
'这种效率要高点,不怎么占用CPU,不过对于事件或消息方面会不会影响就不知道了
Private Sub Command1_Click()
Do
DoEvents
Sleep 2
Label1.Caption = GetTickCount
Loop
End Sub
'这种CPU占用率很高,但事件或消息方面应该不会受影响
Private Sub Command1_Click()
Do
VB_Sleep 2
Label1.Caption = GetTickCount
Loop
End Sub
Private Sub Command1_Click()
Do
DoEvents
Sleep 2
Label1.Caption = GetTickCount
Loop
End Sub
我曾经这样做过,效果不错
http://blog.csdn.net/prsniper/archive/2010/08/14/5811208.aspx
实际上,把操作队列配合Windows消息队列是很不错的
[其他解释]
sleep 是线程可控制的主动休眠方式,执行了sleep之后,线程就会进入休眠状态,何时醒来就看你的参数设置了
sleep不是延时函数,是休眠方法,他只将当前线程冻结,并不冻结整个程序,如果程序是单线程,那程序就会被冻住,原因是线程不被cpu运行了, lz是搞错了 sleep存在的意义。。。
[其他解释]
本帖最后由 bcrun 于 2010-09-22 15:19:24 编辑
DO这样没什么不好,最多加个sleep(50)
Doevents
if XXX then exit do
LOOP
dim tick as integer这种方式只适用于短时间,偶然的一个单线程模拟一个有响应的等待效果。并且不适合多处使用。为了解决楼主所遇到的问题,才有了线程,辅助线程就是为了在处理大量数据消耗时间的时候释放出ui线程而产生的。
tick = GetTickCount()
while GetTickCount() - tick < 5000
DoEvents()
wend
sub delay (delaytime as single)
dim start as single
start=timer
while delaytime>timer-start
doevents
wend
end sub '这样做就不会卡了
Option Explicit
Private Sub Command1_Click()
Dim StartTime As Date
StartTime = Now()
Do
Label1.Caption = DateDiff("S", StartTime, Now())
DoEvents
Loop Until CLng(DateDiff("S", StartTime, Now())) > 10
MsgBox "延时10秒到!"
End Sub
Dim nowtime As Date
nowtime = Now()
While (DateDiff("s", nowtime, Now()) < 3)
DoEvents
Wend
MsgBox "暂停3秒了已经"
你可以用信号量,互斥量什么的。API有
[其他解释]
41#的GetTickCount和vb定时器就好比是馒头和米饭,怎么吃和吃什么就看自己了
[其他解释]
靠,csdn不给编辑权,再发一帖,什么时候才能结束对vb的怨言呢?难道是因爱生恨吗?
就好像喜欢一样东西的同时总希望这个东西也能给自己带来同等甚至超值地快乐,这也是人之常情.
一旦碰到解决不了的问题,脑子里就或多或少地闪出那些所谓的网论,坚决不考虑自己是否有问题...
其实硬要一棍子打死的话vb就是上手非常容易,功能非常强大的windows下的开发工具,从概念上说就这么简单,但为什么非要总结那些网论呢,我想总结者的初衷无非就是想让使用者先了解某个工具的"能"与"不能"后再去选择使用,但总结的时候思路又难免迂回在不同的工具之间,而总结者对这些工具的熟饪程度又难免会有一些凹凸,导致偶尔带出点不保证标准的感情色彩,于是就出现了"无法","不具备","根本不行","做不到",甚至"垃圾"等等一些词汇,其实这些词汇与其用在工具身上,还不如多用在自身反而显得自勉自励些^_^
建议网络人一些该删的评论就删了吧,估计某些评论就是评论者自己回头看看都觉得汗
建议喜爱vb的人也别再过多眷恋那些所谓的网论了,不然就不只是2010-09-21 16:43:00了...
[其他解释]
Private Declare Function GetTickCount Lib "kernel32" () As Long
Private Sub Command1_Click()
Dim STime1 As Long
Dim STime2 As Long
STime1 = GetTickCount
VB_Sleep 10000
STime2 = GetTickCount
MsgBox STime1 & " - " & STime2
End Sub
Private Sub VB_Sleep(ByVal dwMilliseconds As Long)
Dim SaveTime As Long
SaveTime = GetTickCount + dwMilliseconds
Do While SaveTime > GetTickCount
DoEvents
Loop
End Sub
[其他解释]