5

VB6Timer控件启动时是否创建单独的处理线程?

4

2 回答 2

7

VB6 Timer 控件不是在后台线程上运行的某种忙等待循环。他们根本没有真正“跑”。

据我所知,当您设置 Enabled = True(或更改 Interval,如果它为 0)时,控件会调用 SetTimer()。当您设置 Enabled = False(或将 Interval 设置为 0)时,它会调用 KillTimer()。

普通的 VB6 消息循环(当然在 UI 线程上运行)通过将传入的 WM_TIMER 消息分派给相关的 Timer 的事件处理程序代码来处理它们。因此,事件处理程序中的代码在 UI 线程上运行,阻止进一步的消息处理,直到退出。由于遗留原因(16 位 VB 和 Windows),间隔似乎被截断为无符号的 16 位值?

任何像在程序中编写的忙等待循环(所有代码都在 UI 线程上运行)一样的东西当然会阻塞消息处理,从而产生定时器不会“触发”的错觉。由于 WM_TIMER 是低优先级消息,因此当您绑定 UI 线程时,它们不会在消息队列中堆积得很深:

WM_TIMER 消息是低优先级消息。仅当线程的消息队列中没有其他更高优先级的消息时,GetMessage 和 PeekMessage 函数才发布此消息。

于 2012-07-29T15:11:39.893 回答
3

不,计时器在与窗口过程相同的线程中运行,因此与 Visual Basic 6 程序相同。这意味着,如果您执行处理器密集型操作,则不能依赖正在处理的 WM_TIMER 消息。

于 2012-07-29T13:29:01.610 回答