我需要在几秒钟内计算出时间,但我能收到的唯一信息是分钟。
所以我可以每隔5秒向服务器发送一个请求,我会得到一个回复基本上说"嘿,你还剩10分钟",5秒后我可以发送另一个请求服务器,它会说"嘿,你还剩下10分钟"或者它会说"嘿,你现在还有9分钟。"
我认为一旦它告诉我剩下9分钟,我就可以开始计时器。但由于我每5秒刷新一次这个事实并不准确,有时服务器可能需要更长时间才能向我发送信息,那么我上次询问的时间是这样的
所以我的问题基本上是否有任何方法可以根据上述标准准确计算出我剩下的秒数?
编辑:我可以调整发送请求的频率。
答案 0 :(得分:1)
你可以做的是放松偏移误差: 每当你似乎提前或迟到时,让loc_error作为估计值(如果你没有更好的话,可能只需+ 1 / -1)。 然后让time_offset为0.99 * time_offset + 0.1 * loc_error,具体取决于" noisy"是本地错误信息以及您希望收敛到正确值的速度。
答案 1 :(得分:1)
如果您在11:43到11:44之间看一个时钟,请不要大致知道秒数是多少?如果它一旦打到44就开始秒表,现在你可以计算秒表的秒数。
如果你可以每x秒查询一次,你可以知道剩下多少秒,大约x秒的错误。您需要本地高分辨率/高精度时间源,例如Windows中的高性能计数器,可通过Stopwatch
类或pinvokes GetPerformanceCounter
和GetPerformanceFrequency
获得。
所以你有以下几个部分:
GetPerformanceCounter
的HPET符合条件,您可以使用Stopwatch
类来访问它而无需编写任何pinvoke(但我编写了自己的包装而不是使用Stopwatch
)。总体策略如下:
您需要在循环中执行上述操作(当您这样做时,您可以进一步优化它)。
如果您的远程时钟只告诉您几分钟,那么几乎每次查询时,R1和R2都是完全相同的值。
然而,如果碰巧在下一分钟碰到它,R1和R2应该恰好相差一分钟。如果发生这种情况,那么本地计数器L1和L2会告诉您在整个循环过程中经过了多长时间。
如果L2-L1告诉你只有100毫秒过去,那么你知道时间é R2和零秒'发生在100毫秒的某个地方。
因此,当您执行上述循环时:
一旦你有一组时间戳可以使用,你可以从你当地的高精度时钟计算远程时间。
本地时间(R2 - R1) / 2
(称该值为LocalMark)大致等于" R2和零秒" (称该值为RemoteMark)。
从那里,根据当地时间计算的远程时间计算如下:
RemoteTime = (LocalTime - LocalMark) + RemoteMark
LocalTime - LocalMark
告诉你自RemoteMark
以来已经过了多长时间,所以如果将这两个部分加在一起,你应该有远程时间。
...
以上是我从几年前发现的MSDN文章中学到的内容。不幸的是,微软已经退休了这篇文章,它只能通过支路机器找到:
Implement a Continuously Updating, High-Resolution Time Provider for Windows
您还可以从MSDN archives恢复该文章 - 它出现在2004年3月的MSDN杂志上,作为CHM提供 - March 2004 CHM with the article