首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VB >

VB Sleep渣滓等待函数

2012-12-25 
VB Sleep垃圾等待函数本帖最后由 tk600158 于 2010-09-21 16:45:24 编辑其实主要是一个关于SLEEP的问题。SL

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



真的深恶痛绝SLEEP这个垃圾函数。难道学了VB的真的只有去转行学VC 或者.NET?

难道这个就是VB的瓶颈么?谁帮忙看看

[最优解释]
引用:
用定时器,流程上处理就OK了.

比如,有三个流程,每个流程间需要等待一定的时间.

就这样写:


VB code
function StartFun()
    timer1.tag="1"
    timer1.interval=1000       '延时1秒
    timer1.enabled=true
end function

function Fun1……

支持这种用法,对于 VB 来说会效果和效率好很多
[其他解释]
用定时器,流程上处理就OK了.

比如,有三个流程,每个流程间需要等待一定的时间.

就这样写:

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) '声明

[其他解释]

好啊,你自己写个编程语言出来,搞一个好的开发平台,我们也好跟你沾沾光。

------其他解决方案--------------------


你用定时器啊。

把执行过程从流程上拆为多个过程,再由定时器事件进行调用。
[其他解释]
Sleep在VC中常在新开的线程里用,他会让整个线程处于停止状态,CPU会在指定的时间内完全不去处理那个线程的东西。而在VB中,因为多线程的方式不稳定,所以通常都是在单线程下跑,如果用了Sleep来让线程停止,那么就会有卡死的现象(即使在VC里单线程这么跑也会有这种现象),所以才会出现你所说的问题。
在VB中要想等待指定的时间,有VB的方法可以实现,不能按照VC的开发方式思考。就像VC开发当中,很多东西不能用VB的开发方式思考一样。在VB中可以这样实现类似的功能。


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

'这种效率要高点,不怎么占用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

[其他解释]
本帖最后由 bcrun 于 2010-09-22 15:18:35 编辑 你们这样用DoEvents存在很严重的问题,没有考虑到过程重入

Private Sub Command1_Click()
    Do
        DoEvents
        Sleep 2
        Label1.Caption = GetTickCount
    Loop
End Sub


这种代码,如果中间逻辑比较多,涉及到一些模块级的变量改值,会出问题的
用DoEvents一定要慎重
[其他解释]
这种我一般是从流程上处理,而不是在过程中弄个硬等待。
[其他解释]
这个是错误的啊,很多人都错怪sleep了,sleep本来就不是用来延迟的,他的作用本来就是挂起整个程序一段时间,这个作用有时候是非常有用的,你要延迟的时候窗体不被挂起那就意味着程序必须还在运行,那样就不应该用sleep

所以说不是sleep的错,是你自己太菜了
[其他解释]


我曾经这样做过,效果不错

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
    Doevents
    if XXX then exit do
LOOP
这样没什么不好,最多加个sleep(50)
[其他解释]
和Sleep没关系,你个人问题,你需要稍微了解一下现在的分时复用的操作系统原理,每个windows程序都是依赖消息循环的,任何一个程序,都有一个入口地址,当入口函数结束,程序就结束了,所以为了延续程序的运行时间,有了消息循环,这个函数创建一个对象,注册给系统,就会有对应的消息产生和捕获,在消息循环中,处理各个消息才有了基于事件的vb。你的方法,比如按钮按下,就是收到了消息后,调用的。如果你在你的按钮的Click事件中sleep,那也就阻止消息循环继续执行了,消息循环不执行了,你的拖动、点击都不会处理,这就是你为什么看到等待。

而你写的DoEvents方法也不错,你说这个会占用cpu,没错,消息循环本身并不是一个不停运行的循环,而是处理完最后一个消息后,阻塞自己。等待下一次有消息。所以
dim tick as integer
tick = GetTickCount()
while GetTickCount() - tick < 5000
    DoEvents()
wend
这种方式只适用于短时间,偶然的一个单线程模拟一个有响应的等待效果。并且不适合多处使用。为了解决楼主所遇到的问题,才有了线程,辅助线程就是为了在处理大量数据消耗时间的时候释放出ui线程而产生的。

[其他解释]
Sleep很好用啊,只是VB是单线程,所以才会卡死。其实不仅可以等待,当传0的时候,还可以交出线程的时间片。
[其他解释]
VC的sleep函数也是没有反应的
[其他解释]
本帖最后由 bcrun 于 2010-09-23 11:28:15 编辑
sub delay (delaytime as single)
    dim start as single
       start=timer
        while delaytime>timer-start
              doevents
        wend
end sub   '这样做就不会卡了

[其他解释]

我跪下来求您了,您别用VB了,我求求您了。好吗? 

这里我们的人们都那么喜爱VB,您这么用与强奸有什么区别? 

我求您了,别用VB了,她是我的媳妇儿啊。我爱她! 

您看着其他的VC 或者.NET好用,您用其他的。只要别用VB就成了。 

再次恳求您,别用VB了。
[其他解释]
Sleep本来就是用作停顿的,不管是VC还是其他编程语言,它本身是一个API函数,只要你是在Windows平台下都一个功能,关键在于你没有用好,不会用。
如果你不想让你的CPU完全被挂起,你可以使用使用这样的函数太取代Sleep啊
lngP=Gettickcount
Do
    DoEvents
loop until Gettickcount-lngP>XXX
[其他解释]
楼上的真弓虽
[其他解释]
别用了,我求您了。 

VB要是像您这样用法,早晚精尽人亡。 

除了错误就骂人,讲客观条件,怨VB, 

如果错误更大,还不把电脑给摔了。 

求您了,俺给您老跪下了,您别用了好吗?
[其他解释]
是啊,你可以使用WaitForSingleObject
[其他解释]
其实sleep字面意思就是睡觉,而不是wait等待
你用睡觉去执行等待,怎么可能让你满意呢,那么问题是你还是api呢,呵呵

其实要实现真正的等待,就要真正的多线程,其他办法都是假的,而vb无法实现多线程,所以这个简单的“等待”其实实现不了
[其他解释]
看来楼主才叫垃圾!
知道为什么很多人抛弃VB而转向DELPHI么?就因为多线程的问题!
不是VB实现不了是太麻烦!、
而现在都面向对象了,那就.NET,Java了。
------其他解决方案--------------------


引用:
我跪下来求您了,您别用VB了,我求求您了。好吗? 

这里我们的人们都那么喜爱VB,您这么用与强奸有什么区别? 

我求您了,别用VB了,她是我的媳妇儿啊。我爱她! 

您看着其他的VC 或者.NET好用,您用其他的。只要别用VB就成了。 

再次恳求您,别用VB了。

无限的同情这位老婆被 弓虽 女干 的英雄...
[其他解释]
基本上没用过 sleep
[其他解释]
回去看API了,呵呵,楼主被大家喷的,哎
[其他解释]
我知道很多人都抛弃了VB,可我不会的,因为对我而言,能解决问题就行.
[其他解释]
学习了
[其他解释]
引用:
用定时器,流程上处理就OK了.

比如,有三个流程,每个流程间需要等待一定的时间.

就这样写:


VB code
function StartFun()
    timer1.tag="1"
    timer1.interval=1000       '延时1秒
    timer1.enabled=true
end function

function Fun1……


很强悍。。。学习
[其他解释]
拿分走人
[其他解释]
在VB中实现延时(等待)的几种方法
http://www.qqread.com/vb/e241323.html
[其他解释]
赞同,我是个vb出学者, 我发现个问题: 在新线程里, 无论是sleep 还是通过GetTickCount这个办法休眠,Cpu占用是相当高的,我以休眠10毫秒为单位做循环进程cpu都是50% ,我Cpu是t23xx ;改用WaitForSingleObject后,cpu降到0%了,也不知道什么原因。
引用:
是啊,你可以使用WaitForSingleObject

[其他解释]
Sleep是"休眠"不是"延时"
C里面有delay可用,VB没有这个
VB定时器可以勉强用作延时,但是不精确. 如果要求不高,也可以了

[其他解释]
引用:
Sleep是"休眠"不是"延时"
C里面有delay可用,VB没有这个
VB定时器可以勉强用作延时,但是不精确. 如果要求不高,也可以了

没错!要求不高的话用下面这个就可以了:
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

[其他解释]
和我一样,初级水平,望强人解答啊
[其他解释]
我暂同,sleep只是休眠挂起.
[其他解释]

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
[其他解释]

引用:
Sleep是"休眠"不是"延时"
C里面有delay可用,VB没有这个
VB定时器可以勉强用作延时,但是不精确. 如果要求不高,也可以了

vb定时器真的无法精确?
发现许多人包括楼主难免都会有拉不下屎怪茅厕的毛病,换了新茅厕碰巧了又没拉下则接着怪...
这也是人之常情,哈哈
[其他解释]
我晕,这个问题我已经结题了啊,怎么还有这么多人回复。
现在我已经转了VB.net了 用多线程很轻松就解决掉了这个问题。
当时为了让大家多回帖,所以才起了这么有刺激性的题目。呵呵,想不到反应这么大!
大家不要在回复了,谢谢
[其他解释]
引用:
Sleep在VC中常在新开的线程里用,他会让整个线程处于停止状态,CPU会在指定的时间内完全不去处理那个线程的东西。而在VB中,因为多线程的方式不稳定,所以通常都是在单线程下跑,如果用了Sleep来让线程停止,那么就会有卡死的现象(即使在VC里单线程这么跑也会有这种现象),所以才会出现你所说的问题。
在VB中要想等待指定的时间,有VB的方法可以实现,不能按照VC的开发方式思考。就像VC开发当中……

能否不掉用Doevents,图片处理太快,导致显示不了。加Doevents可以,但是如果这个时候动了其他事件,就堆栈溢出了。

热点排行