C# 分秒必争
我需要以秒为单位计算时间,但我能收到的唯一信息是分钟 因此,我可以每5秒向服务器发送一个请求,然后我会得到一个回复,基本上是“嘿,你还有10分钟”,5秒后我可以向服务器发送另一个请求,它会说“嘿,你还有10分钟”或者说“嘿,你现在还有9分钟。” 我想只要计时器告诉我还有9分钟,我就可以启动计时器。但这不会精确到第二秒,因为我每5秒刷新一次,有时服务器向我发送信息的时间会比我上次请求时长一点 所以我的问题是,根据上面的标准,我有没有办法准确地计算出我还剩多少秒C# 分秒必争,c#,math,C#,Math,我需要以秒为单位计算时间,但我能收到的唯一信息是分钟 因此,我可以每5秒向服务器发送一个请求,然后我会得到一个回复,基本上是“嘿,你还有10分钟”,5秒后我可以向服务器发送另一个请求,它会说“嘿,你还有10分钟”或者说“嘿,你现在还有9分钟。” 我想只要计时器告诉我还有9分钟,我就可以启动计时器。但这不会精确到第二秒,因为我每5秒刷新一次,有时服务器向我发送信息的时间会比我上次请求时长一点 所以我的问题是,根据上面的标准,我有没有办法准确地计算出我还剩多少秒 编辑:我发送请求的频率可以调整。您可
编辑:我发送请求的频率可以调整。您可以做的是放宽偏移错误: 每次你似乎提前或延迟,让loc_误差作为估计值(如果没有更好的估计值,可能仅为+1/-1)。
然后让时间偏移量为0.99*时间偏移量+0.1*定位误差,这取决于本地误差信息的“噪音”程度以及收敛到正确值的速度。如果你看到时钟从11:43跳到11:44,你不知道秒数是多少吗?如果它一跳到44,你就启动一个秒表,现在你可以计算秒表的秒数了 如果您可以每x秒查询一次,您就可以知道大约x秒的错误还有多少秒。您需要本地的高分辨率/高精度时间源,例如windows中的高性能计数器,可通过
秒表
类或pinvokesGetPerformanceCounter
和GetPerformanceFrequency
获得
因此,您有以下部分:
- 具有高分辨率和高精度的本地时钟。通过
的HPET符合条件,您可以使用GetPerformanceCounter
类访问它,而无需编写任何pinvokes(但我编写了自己的包装,而不是使用Stopwatch
)Stopwatch
- 一个远程时钟,你正在努力提高精度
- 查询远程时钟的能力
RemoteTime = (LocalTime - LocalMark) + RemoteMark
- 查询您当地的高精度计数器。将此保存为“L1”
- 查询远程时钟。将此保存为“R1”
- 查询远程时钟。将此保存为“R2”
- 查询您当地的高精度计数器。将此保存为“L2”
- 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秒)时启动计时器,当你认为它每分钟都能达到目标时,问一下。你将能够调整你的不确定性。但我不确定你的意思是服务器发送信息需要多长时间。服务器是否总是在发送信息后以相同的时间接收信息,以及从服务器获得响应所需的时间是可变的?