【发布时间】:2010-01-18 15:52:40
【问题描述】:
我使用以下方法创建了一个 Windows 计时器
FHandle := SetTimer(0, 0, 1000, TFNTimerProc(@TMyClass.MyMethod));
此线程是否显示在 Delphi“线程”窗口中。如果是,我怎样才能得到这个线程 ID?
【问题讨论】:
标签: delphi multithreading timer delphi-2010
我使用以下方法创建了一个 Windows 计时器
FHandle := SetTimer(0, 0, 1000, TFNTimerProc(@TMyClass.MyMethod));
此线程是否显示在 Delphi“线程”窗口中。如果是,我怎样才能得到这个线程 ID?
【问题讨论】:
标签: delphi multithreading timer delphi-2010
该函数没有创建线程。当您的程序处理wm_Timer 消息时,操作系统会调用回调函数。它是从调用SetTimer 的同一线程的上下文中调用的,因此该线程最好有一个消息泵。 (如果您是从 VCL 主线程调用它,那么 TApplication 类会为您提供消息泵。)
此外,SetTimer 不返回句柄。它返回一个计时器 ID。
最后,除非该方法是 class static 方法,否则它不会按您希望的方式工作。如果回调的签名与SetTimer 期望您提供的签名相匹配,则不需要类型转换,因此如果您需要对函数指针进行类型转换以使编译器接受您的代码,那么您可能弄错了。
【讨论】:
SetTimer不创建线程,但在指定的超时时间后在主线程的上下文中调用指定的函数。如果您不传递回调函数,SetTimer 会向您的主窗口类发布 WM_TIMER 消息。
请参阅MSDN reference for SetTimer 了解更多信息。
【讨论】: