如何在Windows 11上保证高精度计时器,即使App完全最小化时也如此

问题描述 投票:0回答:1

Windows 上的计时器以每滴答 15.6 毫秒的速率运行。因此,即使您将计时器设置为 1 毫秒,仍然需要 15.6 毫秒才能完成(这确实取决于计时器启动的确切时间,但这就是它的要点)。 使用 timeBeginPeriod(1)(来自 Windows API),您可以将其设置为更高分辨率 1ms。

不幸的是,根据此处找到的文档,在 Windows 11 上,如果窗口拥有的进程最小化,则无法保证分辨率的提高: https://learn.microsoft.com/en-us/windows/win32/api/timeapi/nf-timeapi-timebeginperiod#:~:text=Starting 对于 Windows 11%2C,如果窗口拥有进程完全被阻塞%2C 最小化%2C 或以其他方式对最终用户不可见或听不到%2C Windows 不保证比默认系统分辨率更高的分辨率。有关此行为的更多信息,请参阅 SetProcessInformation

有没有办法保证 Windows 11 上的计时器具有更高的分辨率,即使窗口最小化时也是如此?或者是否有 timeBeginPeriod 的替代方案可以实现此解决方案?

我问的原因: 我们希望开始通过串行端口以 1 毫秒的间隔轮询一些高精度仪器并收集该数据,即使轮询的应用程序最小化也是如此。 有趣的笔记:

  • 不一定要精确为 1 毫秒,1.342 毫秒也可以,但应该在该值左右,而不是默认的计时器分辨率 15.6 毫秒。
  • 我们使用 C# 和 WinUI 作为界面
  • 轮询是在主线程之外完成的
  • 是的,我们正在使用 timeEndPeriod 来停止它。 :)

我一直在寻找与此相关的任何信息,但没有找到任何可以阐明这一点的更多细节。

c# winapi timer
1个回答
0
投票

您不需要深入到 P/Invoke 级别操作来使用高精度计时器,事实上您不应该这样做。您已经构建了 .Net 原语来实现此目的:

  • Stopwatch
    将始终使用高精度计时数据,尽管它当然不是事件驱动对象,它是一个查询对象(即,您询问时间)。
  • PeriodicTimer
    是 .Net 6+ 异步计时器实现,并且将始终使用最高的可用精度来触发其可等待的延续。
© www.soinside.com 2019 - 2024. All rights reserved.