代码之家  ›  专栏  ›  技术社区  ›  Roger Lipscombe

重置可等待计时器

  •  2
  • Roger Lipscombe  · 技术社区  · 16 年前

    来自MSDN:

    这个 CancelWaitableTimer 函数不会更改计时器的信号状态。它会在计时器设置为信号状态之前停止计时器,并取消未完成的APC。因此,在计时器上执行等待操作的线程将一直等待,直到超时或计时器重新激活,并且其状态设置为“已发出信号”。 如果计时器已处于信号状态,它将保持该状态。

    (强调矿山)

    那么:如果我不能调用CancelWaitableTimer,如何将手动重置的可等待计时器设置为非信号状态?resetevent在可等待计时器上不起作用(它失败,错误为\u invalid_handle)。

    我不想使用setwaitabletimer,因为(此时)我不知道要将其设置为什么持续时间。我想我可以将延迟设置为一个很大的数字,但这对我来说有点像是一个黑客。

    2 回复  |  直到 15 年前
        1
  •  2
  •   Will Dean    16 年前

    你能给setwaitabletimer打个电话吗?时间太长了,这是不可能发生的。一旦你知道了时间,再打电话给它。

    更新: 不管是不是hack,文档都很清楚M-R可等待计时器“在调用setwaitabletimer之前一直处于信号状态”。在我看来,这就是你要使用的功能。你只需要有一个很好的常数,叫做“重置计时器”,它被设置为-2^63或其他什么。

        2
  •  0
  •   Community SqlRyan    7 年前

    如果您使等待计时器自动重置,那么等待计时器完成后,它将自动重置。

    但是,来自msdn:

    如果有多个对象被发出信号,函数将返回其对象被发出信号的数组中第一个句柄的索引。

    我最初认为这意味着,如果等待数组中的前一个句柄与可等待计时器同时发出信号,则可能会丢失计时器信号,但后来我读到了

    waitformultipleobjects()从0开始扫描句柄数组,并在找到信号句柄后立即返回。只有第一个找到的句柄被重置为未签名状态;其他句柄则未被触摸。

    Behavior of WaitForMultipleObjects when multiple handles signal at the same time