查找计时器线程是个问题。我有一个父对象,其中包含从TCustomGrid复制的计时器消息。
private
procedure WMTimer(var Msg: TWMTimer); message WM_TIMER; .....................................
它的父母是TWinControl。它在我的对象的受保护部分中调用TimerEvent(ID: Integer); virtual;
。我在我的后代对象中覆盖它,并且该过程首先包含Inherited;
。我在创建中使用了SetTimer(Handle, 1, 60, nil);
,并且在过程中,TimerEvent最后使用了底部的KillTimer(Handle, 1);
。 WMTimer配有一个断点,但不会在我的代码中的任何地方停止计时器线程。 TimerEvent(ID: Integer);
也有一个断点,各处都有相同的结果。我对对象的句柄没有问题,因为我正在使用它来处理其他没有问题的东西。我错过了一些热门电话。
答案 0 :(得分:1)
找到计时器线程是个问题。
计时器不会创建线程。定时器消息和回调在调用SetTimer
的线程上执行。
无论您遇到什么问题,都与计时器线程的存在无关。如果您想要进一步帮助解决问题,我建议您使用MCVE发布新问题。
粗略猜测,您很可能会重新创建VCL窗口。创建计时器时传递的窗口句柄在VCL控件的生命周期内已销毁并重新创建。这是非常正常的行为。
您不应该以这种方式使用VCL控件的窗口句柄,因为窗口需要重新创建。而是使用通过调用AllocateHWnd
创建的定制窗口句柄。关于使用AllocateHWnd
创建的窗口的观点是,您可以控制它们的生命周期。