VB6 Timer控件是否创建单独的线程?

时间:2012-07-29 08:05:52

标签: multithreading vb6 timer

VB6 Timer控件在启动时是否会创建一个单独的处理线程?

2 个答案:

答案 0 :(得分:6)

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

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

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

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

  

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

答案 1 :(得分:3)

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