gpt4 book ai didi

timer - Timer 事件可以重入吗?

转载 作者:行者123 更新时间:2023-12-01 08:28:39 34 4
gpt4 key购买 nike

我正在检查一些可怕的遗留代码,这些代码具有 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/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com