Timer事件可以体验重入吗?

时间:2014-06-11 09:28:16

标签: timer vb6 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

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

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

This reference有一些相关信息。特别是它声明WM_PAINT消息被组合成单个消息,但没有提到WM_TIMER消息是否被组合。

2 个答案:

答案 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
  • 你会看到"开始"表单加载后2秒
  • 你会看到一个"结束"
  • 之后3秒
  • 你会看到"开始"在前一个"结束"之后2秒显示
  • 你会看到一个"结束" "开始"
  • 后3秒
  • ...

如果计时器将被重新进入,我希望每个&#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