【问题标题】:Set the name of a thread created with SetTimer() API设置使用 SetTimer() API 创建的线程的名称
【发布时间】:2010-01-18 15:52:40
【问题描述】:

我使用以下方法创建了一个 Windows 计时器

FHandle := SetTimer(0, 0, 1000, TFNTimerProc(@TMyClass.MyMethod));

此线程是否显示在 Delphi“线程”窗口中。如果是,我怎样才能得到这个线程 ID?

【问题讨论】:

    标签: delphi multithreading timer delphi-2010


    【解决方案1】:

    该函数没有创建线程。当您的程序处理wm_Timer 消息时,操作系统会调用回调函数。它是从调用SetTimer 的同一线程的上下文中调用的,因此该线程最好有一个消息泵。 (如果您是从 VCL 主线程调用它,那么 TApplication 类会为您提供消息泵。)

    此外,SetTimer 不返回句柄。它返回一个计时器 ID。

    最后,除非该方法是 class static 方法,否则它不会按您希望的方式工作。如果回调的签名与SetTimer 期望您提供的签名相匹配,则不需要类型转换,因此如果您需要对函数指针进行类型转换以使编译器接受您的代码,那么您可能弄错了。

    【讨论】:

    • +1 因为你比我多花了一分钟,写了一个非常完整的答案:)
    • 是的,除了关于“ID”是否是“句柄”的挑剔之外,这是一个很好的答案。有些句柄只是ID,有些句柄是指针。进行区分可能会引发不必要的问题,即如何处理 ID [原文如此] 与句柄不同。
    • 不是所有的句柄都是ID,也不是所有的ID都是句柄。将两者混为一谈会阻碍交流。如果你告诉人们你有一个“计时器句柄”,他们可能会认为你在谈论一个可等待的计时器,这根本不是一回事。将计时器事件 ID 视为句柄可能会诱使您在其上调用与句柄相关的函数,例如 DuplicateHandle 或 CloseHandle,但这是不允许的。如果文档称某事物为 ID,则称其为 ID。
    【解决方案2】:

    SetTimer不创建线程,但在指定的超时时间后在主线程的上下文中调用指定的函数。如果您不传递回调函数,SetTimer 会向您的主窗口类发布 WM_TIMER 消息。

    请参阅MSDN reference for SetTimer 了解更多信息。

    【讨论】:

      猜你喜欢
      • 2011-09-19
      • 2015-08-07
      • 2011-01-27
      • 1970-01-01
      • 1970-01-01
      • 2017-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多