【发布时间】:2015-06-02 19:32:21
【问题描述】:
我正在检查一些可怕的遗留代码,这些代码具有 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 消息是否被组合。
【问题讨论】:
-
我为这个问题写了一个小测试程序。 (定时器函数内的长时间运行循环,进入定时器事件时增加一个静态计数器,离开时递减,但在长时间运行循环后输出计数器的值。)似乎VB6没有重新进入定时器例程。
-
如果您有一个运行时间超过计时器间隔的方法,则间隔事件将排队,并且如果您的方法中有任何内容(DoEvents)允许触发事件,您可以在您之前再次输入计时器事件方法已退出。
-
@jac : 您能否将您的测试项目作为答案发布.. 请在下面查看我的答案,其中包含一个不会重新进入计时器事件的测试项目
-
@bob77 我不是在要求最佳实践或如何重构,这是其他人编写的可怕的遗留代码,我需要了解它是如何工作的 - 或者而是如何失败
-
@Hrqls 我已经删除了我之前的示例,所以我尝试重新创建它,现在它没有重新输入,所以......我的错?
标签: timer vb6 message-queue