deleteTimerQueueTimer 函数 (threadpoollegacyapiset.h)

从计时器队列中删除计时器,并根据需要等待当前运行的计时器回调函数完成,然后再删除计时器。

语法

BOOL DeleteTimerQueueTimer(
  [in, optional] HANDLE TimerQueue,
  [in]           HANDLE Timer,
  [in, optional] HANDLE CompletionEvent
);

参数

[in, optional] TimerQueue

计时器队列的句柄。 此句柄由 CreateTimerQueue 函数返回。

如果计时器是使用默认计时器队列创建的,则此参数应为 NULL

[in] Timer

计时器队列计时器的句柄。 此句柄由 CreateTimerQueueTimer 函数返回。

[in, optional] CompletionEvent

系统取消计时器且所有回调函数已完成时要发出信号的事件对象的句柄。 此参数可以为 NULL。

如果此参数 INVALID_HANDLE_VALUE,则函数将等待任何正在运行的计时器回调函数完成,然后返回。

如果此参数为 NULL,则该函数将计时器标记为删除并立即返回。 如果计时器已过期,计时器回调函数将运行到完成。 但是,计时器回调函数完成时不会发送通知。 大多数调用方不应使用此选项,应等待运行计时器回调函数完成,以便执行任何所需的清理。

返回值

如果该函数成功,则返回值为非零值。

如果函数失败,则返回值为零。 要获得更多的错误信息,请调用 GetLastError。 如果错误代码 ERROR_IO_PENDING,则无需再次调用此函数。 对于任何其他错误,应重试调用。

注解

当线程使用模拟时,无法调用此函数。 生成的行为未定义。

从另一个计时器的计时器回调中调用此函数时,可以将 CompletionEvent 设置为 INVALID_HANDLE_VALUE ,前提是回调函数未在计时器线程中执行。 但是,如果两个回调函数尝试对彼此的计时器执行阻止 DeleteTimerQueueTimer 调用,则可能会出现死锁。 此外,不能对与回调关联的计时器执行阻止删除调用。

在持久线程上调用阻止 DeleteTimerQueueTimer 时,请小心。 如果要删除的计时器是使用 WT_EXECUTEINPERSISTENTTHREAD 创建的,则可能会出现死锁。

如果存在未完成的回调函数并且 CompletionEventNULL,则该函数将失败,并将错误代码设置为 ERROR_IO_PENDING。 这表示存在未完成的回调函数。 这些回调要么将执行,要么正在执行中。 回调函数执行完成后,将清理计时器。

若要取消计时器队列中的所有计时器,请调用 DeleteTimerQueueEx 函数。

若要编译使用此函数的应用程序, 请将_WIN32_WINNT 定义为 0x0500 或更高版本。 有关详细信息,请参阅 使用 Windows 标头

要求

要求
最低受支持的客户端 Windows XP [仅限桌面应用]
最低受支持的服务器 Windows Server 2003 [仅限桌面应用]
目标平台 Windows
标头 threadpoollegacyapiset.h
Library Kernel32.lib
DLL Kernel32.dll

另请参阅

CreateTimerQueue

CreateTimerQueueTimer

DeleteTimerQueueEx

同步函数

计时器队列