Timer事件可以体验重入吗?

Car*_*ger 3 vb6 timer message-queue

我正在研究一些可怕的遗留代码,它有一个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
Run Code Online (Sandbox Code Playgroud)

计时器的间隔设置为250,慢速代码可能需要30秒左右才能完成.请注意,表单上有一个按钮,在单击时设置booComplete = True.

鉴于VB6是单线程的并且定时器消息是低优先级的,在DoEvents调用期间可以重新进入Timer事件,或者如果Timer事件当前正在执行,VB6运行时是否会执行Timer事件?

该参考文献有一些相关信息.特别是它声明WM_PAINT消息被组合成单个消息,但没有提到WM_TIMER消息是否被组合.

Hrq*_*qls 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
Run Code Online (Sandbox Code Playgroud)
  • 表格加载后2秒钟你会看到"开始"
  • 你会在3秒后看到"结束"
  • 在前一个"结束"显示后2秒钟,您将看到"开始"
  • 你会在"开始"后3秒看到一个"结束"
  • ...

如果定时器将被重新进入,我希望每个"开始"之间有2秒,但每个"开始"之间似乎有3 + 2 = 5秒

删除DoEvents不会改变行为,只会更改文本的打印时间