timer - Timer 事件可以重入吗?

标签 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

计时器的间隔设置为 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/

相关文章:

c# - 如何清除 rabbitmq (.net) 中的队列路由键绑定(bind)

c# - RabbitMQ:如何防止QueueDeclare自动生成新的Queue

java的时间差

c++ - C++ 中的游戏更新(线程或定时器)?

java - 从android中的第一个 View 获取持续时间

java - 如何延迟两个方法调用之间的时间?

arrays - 如何在vb6中声明一个用户定义类型的数组

javascript - Node.js 可以排队多少个事件?

vb6 - 如何将整个 VB6 项目保存到新文件夹?模块和所有

vbscript - SQL native 客户端数据类型兼容性 - 与 SQLOLEDB 不兼容