我正在检查一些可怕的遗留代码,这些代码具有 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
计时器的间隔设置为 250,慢代码可能需要 30 秒左右才能完成。请注意,表单上有一个按钮在单击时设置 booComplete = True。
鉴于 VB6 是单线程的并且计时器消息的优先级较低,是否完全有可能在 DoEvents 调用期间重新输入 Timer 事件,或者如果 Timer 事件发生,VB6 运行时会阻止 Timer 事件的执行正在执行?
This reference有一些相关信息。特别是它指出 WM_PAINT 消息被组合成一条消息,但没有提及 WM_TIMER 消息是否被组合。
最佳答案
我预计它会重新进入,但似乎不会
看看下面的测试项目:
'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
- 您将在表单加载 2 秒后看到“开始”
- 您将在 3 秒后看到“结束”
- 您将在前一个“结束”显示 2 秒后看到一个“开始”
- 您会在“开始”后 3 秒看到“结束”
- ...
如果重新输入计时器,我预计每次“开始”之间有 2 秒,但每次“开始”之间似乎有 3+2=5 秒
删除 DoEvents 不会改变行为,它只会改变打印文本的时间
关于timer - Timer 事件可以重入吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24159308/