【发布时间】: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