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

vb实现可设置延时

VB如何实现可设置的延时,要实现现1到10分钟的延时。各位大仙,麻烦帮帮忙!!!! --------------------编程问答-------------------- sleep 60000  '60秒 --------------------编程问答--------------------

Sub Delay(TIME As Single)
Dim t As Single
t = Timer
Do
DoEvents
Loop Until Timer - t > TIME
End Sub
--------------------编程问答-------------------- 延时是怎么个概念,主线程完全不工作这可以理解为延时,主线程不工作,但功能程序过一段时间再工作也可以理解为延时。如果你想主线程不工作,就直接在主程序中用 Sleep 这个 API 函数,这样一来你停止工作的这段时间内任何的操作都将无效,如点击按妞、网络信息、定时器等等都将全部停止,如果你自己新建过线程,那么那个新建的线程除外,否则就像死机一样的停在那。如果你只是想某个功能过一段时间执行,你可以采用定时器或多线程技术来实现,定时器简单很多,多线程就麻烦点,毕竟这样做开发理念就已经不是用VB的了,相对要麻烦很多。 --------------------编程问答-------------------- sleep --------------------编程问答-------------------- 可能我没太说明白,是接收数据包,正常是下位机一分钟采集发送一次我接收完后处理存储。现在想给加一个可以设定时间,比如10分钟接收一次。希望尽量说具体点,因为我是刚学习编程没几天。谢谢! --------------------编程问答-------------------- 你可以看看我的这个程序,很简单的:
http://download.csdn.net/detail/SupermanKing/2690778 --------------------编程问答-------------------- sleep不行啊!加上之后,延时的时候感觉程序像卡了一样!还有更好的办法吗? --------------------编程问答-------------------- 我在3楼已经说了,Sleep 是让整个线程停止工作,VB 通常都是单线程工作的,如果你在主线程中用 Sleep,就等于让你的整个应用程序“停止工作”,既然是停止了工作,自然什么处理都不会发生了,只有到了指定时间才会恢复工作。如果有交互界面,肯定会像卡死一样,因为他就是已经被你故意设置成“死”在那一段时间。

如果你只是想让你的某个功能过一段时间执行,那么可以用定时器来触发。如果你想在过程里实现等待指定时间后再执行下一条语句,而同时不影响线程中的其他任务执行,你可以进行一个时间上的循环判断,如果到了指定时间跳出循环,但要注意的是循环的时候加上 Doevents 让释放主控权,这样 VB 才会去处理那些窗口消息什么的事务。比如:


Public Sub vbSleep(lngMillisecond As Long)
   Dim lngNTime As Long, lngSTime As Long
   lngSTime = GetTickCount    ' 这个是 API 函数,是取得从系统登录到当前时间的毫秒数
   Do
      DoEvents
      lngNTime = GetTickCount
   Loop While lngNTime - lngSTime <lngMillisecond
End Sub

'使用范例
Private Sub Command1_Click()
   Dim i As Long
   Cls
   For i=0 To 10
       Print "测试" & i
       vbSleep
   Next i
End Sub
--------------------编程问答-------------------- vbSleep 2000 --------------------编程问答--------------------
引用 8 楼  的回复:
我在3楼已经说了,Sleep 是让整个线程停止工作,VB 通常都是单线程工作的,如果你在主线程中用 Sleep,就等于让你的整个应用程序“停止工作”,既然是停止了工作,自然什么处理都不会发生了,只有到了指定时间才会恢复工作。如果有交互界面,肯定会像卡死一样,因为他就是已经被你故意设置成“死”在那一段时间。

如果你只是想让你的某个功能过一段时间执行,那么可以用定时器来触发。如果你想在过程里实……


这里和我说的delay 有不同吗?  VB自带timer函数,调用就可以啦,精确到毫秒吧


Sub Delay(TIME As Single)
Dim t As Single
t = Timer
Do
DoEvents
Loop Until Timer - t > TIME
End Sub

调用的时候 

delay(1.2)  延时1.2秒  

--------------------编程问答-------------------- 我用你说的这个做了,没有反应,是不是还要加其他程序才能用啊? --------------------编程问答--------------------
Option Explicit
    Dim i As Long
    
Private Sub Form_Load()
    Timer1.Interval = 10000
End Sub

Private Sub Timer1_Timer()
    i = i + 1
    If i >= 60 Then '设10分钟执行一次
        i = 0
        '这儿写需要执行的代码
    End If
End Sub
--------------------编程问答--------------------
引用 2 楼  的回复:
VB code

Sub Delay(TIME As Single)
Dim t As Single
t = Timer
Do
DoEvents
Loop Until Timer - t > TIME
End Sub

可以改为GetTickCont来获取系统时间这样更精确 --------------------编程问答--------------------
Dim 延时秒数 As Single, 计时器间隔秒数 As Long, 已过时间 As Single
Private Sub Command1_Click()
延时秒数 = 3
计时器间隔秒数 = 1
'注意:计时器间隔秒数不能大于60
'600秒就是10分钟
Timer1.Interval = 计时器间隔秒数 * 1000
End Sub

Private Sub Timer1_Timer()
已过时间 = 已过时间 + 计时器间隔秒数
If 已过时间 >= 延时秒数 Then
    已过时间 = 0
    执行定时代码
End If
End Sub
Sub 执行定时代码()
    MsgBox "已过了" & 延时秒数 & "秒"
End Sub
--------------------编程问答--------------------
Dim 延时分钟数 As Long, 已过分钟数 As Long
Private Sub Command1_Click()
延时分钟数 = 10
Timer1.Interval = 60000
End Sub

Private Sub Timer1_Timer()
已过分钟数 = 已过分钟数 + 1
If 已过分钟数 >= 延时分钟数 Then
    执行定时代码
    已过分钟数 = 0
End If
End Sub
Sub 执行定时代码()
    MsgBox "已过了" & 延时分钟数 & "分钟"
End Sub
--------------------编程问答-------------------- SLEEP
--------------------编程问答--------------------
楼主需要的是定时,而不是延迟。

使用 Timer 控件即可。

在窗体上放一个 Timer 控件,双击它,就会进入 Timer1_Timer 事件编辑界面。在 Timer1_Timer 事件中写入接收代码。

此外,在 Form_Load 中或在窗体上单击 Timer 显示属性页,在其中设置 Interval 属性。

因为 Interval 的单位是毫秒,最大值是 65535,所以直接使用最长间隔 65.5 秒。因此,需要一个窗体级的变量作为倍数。


Option Explicit
Dim n As Integer

Private Sub Form_Load()
    Timer1.Interval = 60000 '60 秒
End Sub

Private Sub Timer1_Timer()
    If n = 10 Then
        '在这里写数据接收代码
        
        n = 0
    Else
        n = n + 1
    End If
End Sub
--------------------编程问答--------------------
引用 17 楼  的回复:
楼主需要的是定时,而不是延迟。

使用 Timer 控件即可。

在窗体上放一个 Timer 控件,双击它,就会进入 Timer1_Timer 事件编辑界面。在 Timer1_Timer 事件中写入接收代码。

此外,在 Form_Load 中或在窗体上单击 Timer 显示属性页,在其中设置 Interval 属性。

因为 Interval 的单位是毫秒,最大值是 65535,……



要是这么详细的话, 你还少了一个 

 timer.enable = true  ’打开计时器 --------------------编程问答-------------------- 没有人去考虑一下GETTICKCOUNT API吗? --------------------编程问答-------------------- 这个说真的,我就知道API的sleep,但是但觉效果不好!不知道是不是我用的不好! --------------------编程问答--------------------
引用 20 楼  的回复:
这个说真的,我就知道API的sleep,但是但觉效果不好!不知道是不是我用的不好!


上述这么多方法 总有一个适合你啊,到底什么不行你要说啊! --------------------编程问答-------------------- 又一个不会问问题的孩子 --------------------编程问答-------------------- 不是,是用sleep的时候,程序界面就卡的不动了!还不是像单线执行那样其他的事件不响应那样!我看到别人用sleep的时候虽然其他事件不响应,但是也不至于界面卡,所以我感觉可能是我的程序编的不好。 --------------------编程问答-------------------- 用sleep的时候,当前线程一定是不响应的.

你见别人用没有问题,那见到别人是怎么用的了吗?

我给你个代码,要是再说没用,我也吐血去.....

public sub Delay(byval delayS as long)
    dim I as long

    i=gettickcount
    do
        if gettickcount-i>delayS*1000 then exit do
        sleep 10
        doevents
    loop
end sub


输入的参数单位是秒,要延时60秒就:

call delay(60)

gettickcount和sleep函数的声明不用我写上吧.... --------------------编程问答-------------------- '调用api函数timegettime(计算开机到现在的时间)
Private Declare Function timeGetTime Lib "winmm.dll" () As Long

Private Function YanShi(HaoMiao As Double) '定义延时函数
    Dim t1
    t1 = timeGetTime
    While (timeGetTime - t1) < HaoMiao
      DoEvents  '转让控制权,以便让系统处理其他事件
    Wend
End Function

调用时直接写
 YanShi(60000)就可以延时1分钟 --------------------编程问答-------------------- 用api 函数 gettickcount 绝对正解!
补充:VB ,  基础类
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,