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消息是否被组合.
我预计它会重新进入,但似乎没有
看看下面的测试项目:
'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 = 5秒
删除DoEvents不会改变行为,只会更改文本的打印时间
| 归档时间: |
|
| 查看次数: |
1328 次 |
| 最近记录: |