C# 分秒必争

C# 分秒必争,c#,math,C#,Math,我需要以秒为单位计算时间,但我能收到的唯一信息是分钟 因此,我可以每5秒向服务器发送一个请求,然后我会得到一个回复,基本上是“嘿,你还有10分钟”,5秒后我可以向服务器发送另一个请求,它会说“嘿,你还有10分钟”或者说“嘿,你现在还有9分钟。” 我想只要计时器告诉我还有9分钟,我就可以启动计时器。但这不会精确到第二秒,因为我每5秒刷新一次,有时服务器向我发送信息的时间会比我上次请求时长一点 所以我的问题是,根据上面的标准,我有没有办法准确地计算出我还剩多少秒 编辑:我发送请求的频率可以调整。您可

我需要以秒为单位计算时间,但我能收到的唯一信息是分钟

因此,我可以每5秒向服务器发送一个请求,然后我会得到一个回复,基本上是“嘿,你还有10分钟”,5秒后我可以向服务器发送另一个请求,它会说“嘿,你还有10分钟”或者说“嘿,你现在还有9分钟。”

我想只要计时器告诉我还有9分钟,我就可以启动计时器。但这不会精确到第二秒,因为我每5秒刷新一次,有时服务器向我发送信息的时间会比我上次请求时长一点

所以我的问题是,根据上面的标准,我有没有办法准确地计算出我还剩多少秒


编辑:我发送请求的频率可以调整。

您可以做的是放宽偏移错误: 每次你似乎提前或延迟,让loc_误差作为估计值(如果没有更好的估计值,可能仅为+1/-1)。
然后让时间偏移量为0.99*时间偏移量+0.1*定位误差,这取决于本地误差信息的“噪音”程度以及收敛到正确值的速度。

如果你看到时钟从11:43跳到11:44,你不知道秒数是多少吗?如果它一跳到44,你就启动一个秒表,现在你可以计算秒表的秒数了

如果您可以每x秒查询一次,您就可以知道大约x秒的错误还有多少秒。您需要本地的高分辨率/高精度时间源,例如windows中的高性能计数器,可通过
秒表
类或pinvokes
GetPerformanceCounter
GetPerformanceFrequency
获得

因此,您有以下部分:

  • 具有高分辨率和高精度的本地时钟。通过
    GetPerformanceCounter
    的HPET符合条件,您可以使用
    Stopwatch
    类访问它,而无需编写任何pinvokes(但我编写了自己的包装,而不是使用
    Stopwatch
  • 一个远程时钟,你正在努力提高精度
  • 查询远程时钟的能力
总的战略如下:

RemoteTime = (LocalTime - LocalMark) + RemoteMark
  • 查询您当地的高精度计数器。将此保存为“L1”
  • 查询远程时钟。将此保存为“R1”
  • 查询远程时钟。将此保存为“R2”
  • 查询您当地的高精度计数器。将此保存为“L2”
您需要在循环中执行上述操作(执行时,您可以进一步优化)

如果你的远程时钟只告诉你分钟,那么几乎每次你查询它时,R1和R2都是完全相同的值

但是,如果您在它滴答滴答地跳到下一分钟时刚好捕捉到它,R1和R2应该相差整整一分钟。如果发生这种情况,那么本地计数器L1和L2会准确地告诉您在整个循环中经过了多少时间

如果L2-L1告诉您只经过了100毫秒,那么您知道时间“R2和零秒”发生在这100毫秒的某个地方

因此,当您执行上述循环时:

  • R1和R2告诉您远程时间是多少,并告诉您是否看到它跳到下一分钟——“零秒”时间
  • L1和L2告诉您与“零秒”时间对应的本地时间是多少,它们告诉您有多大的错误
一旦有了一组时间戳,您就可以从本地高精度时钟计算远程时间

本地时间
(R2-R1)/2
(称该值为LocalMark)大致等于“R2和零秒”(称该值为RemoteMark)

由此,根据本地时间计算的远程时间计算如下:

RemoteTime = (LocalTime - LocalMark) + RemoteMark
LocalTime-LocalMark
告诉您自使用
RemoteMark
以来已经过了多少时间,因此如果将这两部分相加,您应该拥有远程时间

以上是我从几年前发现的一篇MSDN文章中学到的东西。不幸的是,Microsoft已将该文章作废,只能通过wayback机器找到:


您还可以从2004年3月版的MSDN杂志(以CHM形式提供)中恢复文章-

否,除非您更频繁地发送请求。您的请求是否必须每5秒一次?5太过整齐地进入60,随着时间的推移,没有任何用处。很抱歉,我刚才进行了编辑,刚刚意识到我可以调整请求时间。你唯一能做的就是根据以前的计时信息,对秒数进行最佳估计。你可以在9分钟(±5秒)时启动计时器,当你认为它每分钟都能达到目标时,问一下。你将能够调整你的不确定性。但我不确定你的意思是服务器发送信息需要多长时间。服务器是否总是在发送信息后以相同的时间接收信息,以及从服务器获得响应所需的时间是可变的?