我正在研究一些可怕的遗留代码,它们有一个Timer事件,其中包含一些包含DoEvents调用的冗长代码。简化版看起来像这样:
Private Sub tmrProcess_Timer()
'Run some slow processing code here
DoEvents
'More slow code here
DoEvents
'Lots more slow code and the occasional DoEvents here
If booComplete Then
tmrProcess.Enabled = False
End If
End Sub
计时器将Interval设置为250,慢速代码可能需要30秒左右才能完成。请注意,表单上有一个按钮,在单击时设置booComplete = True。
鉴于VB6是单线程的并且定时器消息是低优先级的,因此在DoEvents调用期间重新进入Timer事件或者如果Timer事件是VB6运行时阻止执行Timer事件目前正在执行?
This reference有一些相关信息。特别是它声明WM_PAINT消息被组合成单个消息,但没有提到WM_TIMER消息是否被组合。
答案 0 :(得分:5)
我预计它会重新进入,但似乎不是
查看以下测试项目:
'1 form with:
' 1 timer control : Name=Timer1
Option Explicit
Private Sub Form_Load()
WindowState = vbMaximized
Timer1.Interval = 2000
End Sub
Private Sub Timer1_Timer()
Static intCount As Integer
Dim sngTime As Single
intCount = intCount + 1
Print CStr(Now) & " Timer event fired " & CStr(intCount)
sngTime = Timer + 3
Do While sngTime > Timer
DoEvents
Loop
Print CStr(Now) & " End of timer event " & CStr(intCount)
End Sub
如果计时器将被重新进入,我希望每个&#34;开始&#34;之间有2秒,但每个&#34;开始&#34; <之间似乎有3 + 2 = 5秒/强>
删除DoEvents不会改变行为,只会改变文本的打印时间
答案 1 :(得分:3)
为避免重新进入,请禁用定时器,直到执行逻辑运行时再重新启用。
Private Sub tmrProcess_Timer()
tmrProcess.Enabled = False
'your time taking logic goes here ......
tmrProcess.Enabled = True
End Sub