【问题标题】:microsecond timer in windowsWindows中的微秒计时器
【发布时间】:2020-01-06 19:09:29
【问题描述】:

我正在使用 C++ Builder 开发一个 windows 应用程序,我需要以微秒为单位的时间间隔定期调用一个函数。 C++ Builder 的 TTimer 类只允许我以毫秒为单位设置这个间隔。我也尝试使用 Windows 的 Waitable 计时器 (https://docs.microsoft.com/en-us/windows/win32/sync/using-a-waitable-timer-with-an-asynchronous-procedure-call),但时间只能以毫秒为单位进行调整。有没有办法在微秒内实现类似的功能?

【问题讨论】:

  • 在非实时操作系统上的微秒计时是一个难题。除非您愿意在繁忙的循环中丢掉大量周期,否则您最好在毫秒内使用 max(1, frequency/1000),因为在依赖 OS 调度程序时,您的精度最多可能会在该范围内。跨度>
  • 有什么特殊原因不能使用std::chrono 库吗?从 C++11 开始,这确实是处理时间的方法。
  • Chrono 最终会调用 Windows API,而 Windows 并不是为精确计时而构建的。
  • 是的,但 Windows 确实通过 QueryPerformance(Counter|Frequency)() 提供了一个高性能计时器,<chrono> 库很可能会在其在 Windows 上的实现中使用。
  • 为什么首先需要这个?答案会影响解决方案...例如,您可以执行一个虚拟线程来轮询QueryPerformanceCounter,并以[us] 粒度调用/执行您想要的代码,但这将是单 CPU 核心负载的 100%,需要调整限制操作系统调度干预的亲和力和优先级......仍然需要记住它会经常被它暂停。在某些情况下,使用 FIFO 可以消除对高精度定时器的需求......有时时钟抽动方法就足够了......

标签: c++ timer callback c++builder


【解决方案1】:

过去,计时器的最小分辨率为 +- 10 毫秒。即使将计时器设置为 1ms,也不会在 1ms 之后发生,而是在 7-10ms 左右(有时甚至更长)。在这种情况下,在 Windows 中对计时器进行更精细的分辨率将毫无意义。您不能依赖计时器来获得快速响应时间,也不能预测您的程序何时会被操作系统从 CPU 中换出。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-19
    • 1970-01-01
    • 1970-01-01
    • 2022-04-05
    • 2011-01-25
    • 2017-08-11
    • 1970-01-01
    相关资源
    最近更新 更多