C++ 如何在不使用Sleep()的情况下创建时间计数器?

C++ 如何在不使用Sleep()的情况下创建时间计数器?,c++,winapi,C++,Winapi,我想创建一个时间计数器,可以从120分钟开始计算。我曾想过使用Sleep(),但我发现Sleep()并不准确(因此倒计时可能需要122分钟而不是120分钟!)。我还有其他选择吗?设置定时器,然后处理WM\u定时器消息。设置定时器,然后处理WM\u定时器消息。设置定时器,然后处理WM\u定时器消息。设置定时器,然后处理WM\u定时器消息。睡眠(120*3600*1000)足够准确,这将需要120分钟,也许还需要几毫秒 如果你试图一次重复睡一分钟,你就会遇到问题,因为睡眠过量会累积。这可以通过检查到

我想创建一个时间计数器,可以从120分钟开始计算。我曾想过使用
Sleep()
,但我发现
Sleep()
并不准确(因此倒计时可能需要122分钟而不是120分钟!)。我还有其他选择吗?

设置定时器,然后处理WM\u定时器消息。

设置定时器,然后处理WM\u定时器消息。

设置定时器,然后处理WM\u定时器消息。

设置定时器,然后处理WM\u定时器消息。

睡眠(120*3600*1000)
足够准确,这将需要120分钟,也许还需要几毫秒

如果你试图一次重复睡一分钟,你就会遇到问题,因为睡眠过量会累积。这可以通过检查到目前为止你睡过头的时间来解决(比较初始的
time()
和当前的
time()
值,以一分钟为单位)。这样,你偶尔可以睡59秒而不是一分钟

睡眠(120*3600*1000)
足够精确,这需要120分钟,也许还需要几毫秒

如果你试图一次重复睡一分钟,你就会遇到问题,因为睡眠过量会累积。这可以通过检查到目前为止你睡过头的时间来解决(比较初始的
time()
和当前的
time()
值,以一分钟为单位)。这样,你偶尔可以睡59秒而不是一分钟

睡眠(120*3600*1000)
足够精确,这需要120分钟,也许还需要几毫秒

如果你试图一次重复睡一分钟,你就会遇到问题,因为睡眠过量会累积。这可以通过检查到目前为止你睡过头的时间来解决(比较初始的
time()
和当前的
time()
值,以一分钟为单位)。这样,你偶尔可以睡59秒而不是一分钟

睡眠(120*3600*1000)
足够精确,这需要120分钟,也许还需要几毫秒


如果你试图一次重复睡一分钟,你就会遇到问题,因为睡眠过量会累积。这可以通过检查到目前为止你睡过头的时间来解决(比较初始的
time()
和当前的
time()
值,以一分钟为单位)。这样,你偶尔可以睡59秒而不是一分钟

不知道自己真正想做什么这里有一些方法可以做到:

  • 使用std::chrono的时钟不断检查当前时间。高分辨率或稳定的时钟是很好的选择。您可能希望生成线程以减少CPU上的忙等待效应
  • 使用std::conditional_变量在预锁定的互斥锁上执行等待(time_point)。它将永远无法锁定互斥锁,因此将在您所需的时间后超时
  • 与2相同的技巧。而是使用WaitForSingleObject

  • 不知道自己真正想做什么,以下是一些方法:

  • 使用std::chrono的时钟不断检查当前时间。高分辨率或稳定的时钟是很好的选择。您可能希望生成线程以减少CPU上的忙等待效应
  • 使用std::conditional_变量在预锁定的互斥锁上执行等待(time_point)。它将永远无法锁定互斥锁,因此将在您所需的时间后超时
  • 与2相同的技巧。而是使用WaitForSingleObject

  • 不知道自己真正想做什么,以下是一些方法:

  • 使用std::chrono的时钟不断检查当前时间。高分辨率或稳定的时钟是很好的选择。您可能希望生成线程以减少CPU上的忙等待效应
  • 使用std::conditional_变量在预锁定的互斥锁上执行等待(time_point)。它将永远无法锁定互斥锁,因此将在您所需的时间后超时
  • 与2相同的技巧。而是使用WaitForSingleObject

  • 不知道自己真正想做什么,以下是一些方法:

  • 使用std::chrono的时钟不断检查当前时间。高分辨率或稳定的时钟是很好的选择。您可能希望生成线程以减少CPU上的忙等待效应
  • 使用std::conditional_变量在预锁定的互斥锁上执行等待(time_point)。它将永远无法锁定互斥锁,因此将在您所需的时间后超时
  • 与2相同的技巧。而是使用WaitForSingleObject


  • 它不一定比
    Sleep()
    更准确。如果队列中有更高优先级的消息,则其传递将被延迟。@Sean:
    SetTimer
    延迟1000毫秒对于预期目的来说足够准确(以分钟和秒为单位显示当前剩余部分的倒计时)。由于基本/开始时间是已知的,因此只要处理
    WM\u TIMER
    ,也可以调整参数。@IInspectable-我想您会发现
    Sleep()
    在相同的延迟下也是可以接受的。另外,这个问题没有提到有一个窗口可以发布WM_计时器。必须创建一个窗口才能发布到它是疯狂的。@Sean:
    Sleep
    意味着第二个线程。创建一个只显示消息的窗口来处理消息一点也不疯狂。@IInspectable-不,它没有。如果你看一下被接受的答案,你会发现海报将使用
    Sleep()
    ,而没有提到任何附加的线程。此外,如果该程序是一个控制台应用程序或服务呢?此外,如果添加窗口,则需要处理消息队列以使其工作,这会使解决方案过于复杂。它不一定比
    Sleep()
    更准确。如果你有更高的优先级