【问题标题】:How can I run applications at a fixed frequency?如何以固定频率运行应用程序?
【发布时间】:2021-07-03 18:05:52
【问题描述】:

有没有办法让应用程序或线程以固定速率运行?

我正在尝试在联网客户端之间进行一些确定性模拟,并希望两台机器 (Windows) 以固定、不变的速率运行或处理数据。这可能吗?

【问题讨论】:

  • 您必须更具体地说明您的意思。时间在计算机科学中有许多怪癖,这个问题似乎并没有完全理解。请更详细地描述您正在尝试做的事情。

标签: c# windows multithreading time simulation


【解决方案1】:

您无法使现有应用程序以特定速度运行(可能有基于 VM 的解决方案可以使执行速度正常化,但我自己不知道这些)。

如果您编写自己的代码,通常的方法是在处理下一次迭代之间基本上休眠。它通常用于处理能力低于 CPU 能力的(简单)游戏。

伪代码:

 while(true)
 {
     executeStep();
     await Task.Delay(GetTimeforNextStep() - DateTime.Now.Utc);
 }

请注意,消费级操作系统(Windows/Linux/MacOS)无法实现精确同步 - 您需要 RTOS 以实现精确的毫秒级计时。

【讨论】:

  • 您假设他们希望循环以固定速率进行轮询。从他们的问题来看,这根本不是他们要问的。
  • 重新计算 Task.Delay 参数是 Win32“等待计时器”对象的一个​​相当差的替代品,但 there isn't a convenient way to use the waitable timer from C#
  • 这就是答案。我想在网络上以锁步方式编写确定性模拟,但避免强迫客户端相互等待步进(相反,利用回滚来协调客户端获取数据不同步)。因此,我想知道我是否可以启动所有客户端并以相同的速率简单地运行它们。我知道这不能保证,尽管我很好奇(并且可能会探索)我可以在中端 Windows pc 硬件上使用有延迟的任务有多接近。
  • 我发现这种方法的时序分辨率很差,不太可能产生一致的结果。更多信息在这里:stackoverflow.com/questions/3744032/…
  • @Lanefox 完全不足为奇。如果你已经解释了你想要做什么,你会得到更好的建议。对于网络系统之间的时间同步示例,也许您可​​以研究streaming music 在网络上同步的问题。它可能不适用于您的问题,但同样,您没有告诉我们您要做什么,因此试图帮助我们只能猜测。不言而喻,这不利于找到最佳解决方案。
猜你喜欢
  • 2023-01-13
  • 2014-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-16
  • 1970-01-01
  • 2023-03-05
相关资源
最近更新 更多