我需要在一个for循环当中进行处理,因为循环估计要进行1千次以上的计算和处理,因此明显的是for的循环开始后的速度是需要控制的,比如控制到1秒钟进行一次循环。
假设循环如下Private Sub Command_Click()
for i=0 to 100
print "一秒钟显示一次"
next
End Sub
请问如何实现这样的控制呢?
假设循环如下Private Sub Command_Click()
for i=0 to 100
print "一秒钟显示一次"
next
End Sub
请问如何实现这样的控制呢?
Option ExplicitPrivate Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Dim cCount As Long '保存运行的次数'答案有二种
'第一种 用API
Private Sub Command1_Click()
Dim i As Long
For i = 0 To 100 '运行100次
Me.Print "一秒钟显示一次" & i
Sleep 1000 '暂停1秒
DoEvents
Next
End Sub
'第二种 增加一个 Timer 控件Private Sub Form_Load()
Timer1.Enabled = True
'Timer1.Interval = 1000 '一秒一次
cCount = 0
End SubPrivate Sub Timer1_Timer()
If cCount < 100 Then '运行100次
Me.Print "一秒钟显示一次"
Else
Timer1.Enabled = False
End If
End Sub
Timer1.Interval = 1000
End SubPrivate Sub Timer1_Timer()
Print "一秒钟显示一次"End Sub
Dim I As IntegerPrivate Sub Form_Load()
Timer1.Interval = 1000
I = 1
End SubPrivate Sub Timer1_Timer()
If I > 1000 Then Timer1.Enabled = False: Exit Sub
Print "一秒钟显示一次"
I = I + 1
End Sub
要计数:
Dim I As IntegerPrivate Sub Command1_Click()
If I > 1000 Then Timer1.Enabled = False: Exit Sub
Print "一秒钟显示一次"
I = I + 1
End SubPrivate Sub Form_Load()
Timer1.Interval = 1000
I = 1
End SubPrivate Sub Timer1_Timer()
Call Command1_Click
End Sub
Private Sub Command1_Click()
Timer1.Enabled = True
'Timer1.Interval = 1000 '一秒一次
cCount = 0
End SubPrivate Sub Timer1_Timer()
If cCount < 10 Then '运行100次
Me.Print "一秒钟显示一次"
Else
Timer1.Enabled = False
End If
cCount = cCount + 1
End Sub
'但是还是有点问题.
'如果产用这种方式,还是会多占用系统资源的.Option ExplicitPrivate Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Dim isLoad As Boolean '保存是否在运行
Dim i As Long'第一种 用API
Private Sub Command1_Click()
If Not isLoad Then
isLoad = True
For i = 0 To 100 '运行100次
doevents
Me.Print "一秒钟显示一次" & i
Sleep 1000 '暂停1秒
DoEvents
Next
isLoad = False
End If
End SubPrivate Sub Form_Load()
isLoad = False
End SubPrivate Sub Form_Unload(Cancel As Integer)
If isLoad Then
If MsgBox("要退出吗?", vbYesNo) = vbYes Then
i = 100
Else
Cancel = 1
End If
End If
End Sub
谢谢,也许是列子导致出现呢误解,事实上不是要控制显示 print,而是要延迟for循环的循环速度
Private LoopCount As LongPrivate Sub Form_Load()
Timer1.Enabled = True
Timer1.Interval = 1000
LoopCount = 0
End SubPrivate Sub Timer1_Timer()
LoopCount = LoopCount + 1
If LoopCount < 100 Then
Me.Print "一秒钟显示一次"
Else
Timer1.Enabled = False
End If
End Sub
Dim nowtime As Datenowtime = Time()Do While TrueIf DateDiff("s", nowtime, Time()) = nSecond Then
Exit Do
End If
DoEvents
LoopEnd SubPrivate Sub Command1_Click()
For i = 1 To 30
Call time_delay(1) '单位是秒
Print "一秒钟显示一次"
Next iEnd Sub
但是,你这个代码有2个缺点:
1、不够简洁。调用函数是要付出代价的,你的问题本身很简单,而用Timer计时器,本身比你这个快,再加上一秒一次,也不影其他响鼠标事响应。
2、不是匀速显示,有时快,有时慢。而用Timer计时器,则没有这个缺点。所以,我还是推荐 fvflove 的第二钟方法,只不过我加了一个窗体变量LoopCount 来控制循环。
很明显,第二种想使用到for循环当中是有难度的,这是没有选择第二种的原因,事实上我的要求是控制for循环,而不是显示,这里的显示这是作为演示。因此第二种就不符合要求了。
我的要求是延迟的目的是控制for循环的循环速度,而且这个循环可能使用在任何地方,如按钮控件,其他函数以及过程,更加有可能在类和模块当中使用。因此无论是前面的第一种和第二种都是有困难的。
可以写一个出来吗?要求可以自定义延迟时间,不使用API和时间控件,可以灵活使用在任何地方,包括模块,类,可以灵活引用。