VB6的
Timer
控件在启动时是否会创建一个单独的处理线程?Timer
控件在启动时是否会创建一个单独的处理线程?VB6计时器控件并不是在后台线程上运行的某种繁忙等待循环。它们实际上并没有“运行”。
据我所知,当您将Enabled = True(或更改Interval,如果为0)时,该控件会进行SetTimer()调用。当您将Enabled = False(或将Interval设置为0)时,它会进行KillTimer()调用。
正常的VB6消息循环(当然在UI线程上运行)通过将传入的WM_TIMER消息分派到关联的计时器事件处理程序代码来处理它们。因此,您事件处理程序内部的代码将在UI线程上运行,在退出之前阻止进一步的消息处理。Interval似乎被切片为一个无符号16位值-出于遗留原因(16位VB和Windows)?
像编写在程序中的繁忙等待循环(所有代码都在UI线程上运行)这样的任何内容,当然会阻塞消息处理,从而产生计时器不会“触发”的错觉。由于WM_TIMER是低优先级消息,因此当您将UI线程绑定在一起时,它们不会在消息队列中深度堆叠:
WM_TIMER消息是低优先级消息。 GetMessage和PeekMessage函数仅在线程的消息队列中没有其他高优先级消息时才发布此消息。
DoEvents
是否可以保持UI响应,从而给人多线程的错觉? - CJ7