Delphi OOP计时器消息

时间:2016-01-13 07:06:03

标签: delphi oop timer

查找计时器线程是个问题。我有一个父对象,其中包含从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);也有一个断点,各处都有相同的结果。我对对象的句柄没有问题,因为我正在使用它来处理其他没有问题的东西。我错过了一些热门电话。

1 个答案:

答案 0 :(得分:1)

  

找到计时器线程是个问题。

计时器不会创建线程。定时器消息和回调在调用SetTimer的线程上执行。

无论您遇到什么问题,都与计时器线程的存在无关。如果您想要进一步帮助解决问题,我建议您使用MCVE发布新问题。

粗略猜测,您很可能会重新创建VCL窗口。创建计时器时传递的窗口句柄在VCL控件的生命周期内已销毁并重新创建。这是非常正常的行为。

您不应该以这种方式使用VCL控件的窗口句柄,因为窗口需要重新创建。而是使用通过调用AllocateHWnd创建的定制窗口句柄。关于使用AllocateHWnd创建的窗口的观点是,您可以控制它们的生命周期。