vb实现可设置延时
VB如何实现可设置的延时,要实现现1到10分钟的延时。各位大仙,麻烦帮帮忙!!!! --------------------编程问答-------------------- sleep 60000 '60秒 --------------------编程问答----------------------------------------编程问答-------------------- 延时是怎么个概念,主线程完全不工作这可以理解为延时,主线程不工作,但功能程序过一段时间再工作也可以理解为延时。如果你想主线程不工作,就直接在主程序中用 Sleep 这个 API 函数,这样一来你停止工作的这段时间内任何的操作都将无效,如点击按妞、网络信息、定时器等等都将全部停止,如果你自己新建过线程,那么那个新建的线程除外,否则就像死机一样的停在那。如果你只是想某个功能过一段时间执行,你可以采用定时器或多线程技术来实现,定时器简单很多,多线程就麻烦点,毕竟这样做开发理念就已经不是用VB的了,相对要麻烦很多。 --------------------编程问答-------------------- sleep --------------------编程问答-------------------- 可能我没太说明白,是接收数据包,正常是下位机一分钟采集发送一次我接收完后处理存储。现在想给加一个可以设定时间,比如10分钟接收一次。希望尽量说具体点,因为我是刚学习编程没几天。谢谢! --------------------编程问答-------------------- 你可以看看我的这个程序,很简单的:
Sub Delay(TIME As Single)
Dim t As Single
t = Timer
Do
DoEvents
Loop Until Timer - t > TIME
End Sub
http://download.csdn.net/detail/SupermanKing/2690778 --------------------编程问答-------------------- sleep不行啊!加上之后,延时的时候感觉程序像卡了一样!还有更好的办法吗? --------------------编程问答-------------------- 我在3楼已经说了,Sleep 是让整个线程停止工作,VB 通常都是单线程工作的,如果你在主线程中用 Sleep,就等于让你的整个应用程序“停止工作”,既然是停止了工作,自然什么处理都不会发生了,只有到了指定时间才会恢复工作。如果有交互界面,肯定会像卡死一样,因为他就是已经被你故意设置成“死”在那一段时间。
如果你只是想让你的某个功能过一段时间执行,那么可以用定时器来触发。如果你想在过程里实现等待指定时间后再执行下一条语句,而同时不影响线程中的其他任务执行,你可以进行一个时间上的循环判断,如果到了指定时间跳出循环,但要注意的是循环的时候加上 Doevents 让释放主控权,这样 VB 才会去处理那些窗口消息什么的事务。比如:
--------------------编程问答-------------------- vbSleep 2000 --------------------编程问答--------------------
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
这里和我说的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
可以改为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--------------------编程问答-------------------- SLEEP
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
--------------------编程问答--------------------
楼主需要的是定时,而不是延迟。
使用 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
要是这么详细的话, 你还少了一个
timer.enable = true ’打开计时器 --------------------编程问答-------------------- 没有人去考虑一下GETTICKCOUNT API吗? --------------------编程问答-------------------- 这个说真的,我就知道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 , 基础类