【问题标题】:Interval of a timer - from integer to float/double - Delphi计时器的间隔 - 从整数到浮点/双精度 - Delphi
【发布时间】:2012-02-09 19:45:06
【问题描述】:

有没有办法解决 Ttimer 间隔的限制,使其更精确?例如,而不是像 1000ms 这样的整数,而是使用 1000.5ms 。如果没有,我可以使用哪个组件来代替,这会给我更精确的间隔

【问题讨论】:

  • Windows 计时器分辨率通常为 15 毫秒。我完全无法理解你的问题。
  • 就像大卫已经说过的那样,计时器事件不会每次都以精确的 1000 毫秒触发,但是我不明白为什么您需要将计时器与网站同步...跨度>
  • 对不起沃伦,但我似乎不明白什么如此令人困惑当我将我的计时器间隔设置为 1014 毫秒时,一个小时后我检查并看到我拥有的计时器与他们相比早(快)计时器。当我是 1015 一个小时后,我可以看到现在以秒为单位的差异,而我的计时器为时已晚(慢)
  • 你的问题毫无意义。这对于喜欢有意义的事情的人来说是令人困惑的。对于初学者,“同步”是什么意思?你的意思是,“当我认为那个人会触发他的计时器时,猜测并触发我的计时器?”
  • 停止使用计时器来测量时间。计时器可以保证的只是它不会早于您指定的时间间隔触发。它可以在以后的任何时间触发。

标签: delphi timer integer double intervals


【解决方案1】:

您正试图以合理的准确度记录时间。但是,标准系统计时器不能用于此目的。系统计时器所保证的只是它会在您指定的时间间隔不早触发。如果您延迟发送消息队列,您可能会延迟收到消息。很简单,系统计时器并非旨在用作秒表,尝试这样做是不合适的。

相反,您需要使用高分辨率性能计数器,您可以通过调用 QueryPerformanceCounter 来获取它。

如果您使用的是 Delphi 2010 或更高版本,则可以使用Diagnostics.TStopwatch,它为高性能计时器提供了一个非常方便的包装器。

您仍然可以使用系统计时器让您的应用有规律的滴答声或脉冲,但请确保您使用高分辨率计时器跟踪时间。

说了这么多,我不确定你是否能够实现你希望做的事情。如果您想保持合理准确的时间,那么我上面所说的是正确的。尝试与运行在网络远程另一台机器上的代码保持锁步同步听起来对我来说非常棘手。

【讨论】:

  • 好吧,如果我告诉你,当第二个计时器经过 6 小时后,计时器的两个计时器都重置为 6:00 和 6:00- 但例如,当第一个计时器第二个达到 3:00 时只是在 3:30 ,所以更准确的间隔最终会让我足够精确,可以将准确的秒数作为第二个计时器,最终在超过 6 小时后会有差异,但我只需要它是准确的正好 6 小时,那么有没有办法让间隔比整数毫秒更精确?
  • 回答这个问题就是重复我自己。停止使用系统计时器。请改用高分辨率计时器。
  • 当我尝试做类似 watch:TStopwatch 的事情时,我只是检查并且 delphi 无法识别 TStopwatch,即使我有 delphi 2010 。有没有办法下载,兼容2010?因为我没找到。
【解决方案2】:

1) TTimer 类对于您的任务来说不够准确,期间! (同样,网站计时器也不会)

2) 如果您使用 TimeBeginPeriod() API 调用增加计时器分辨率,这将使您更接近,但仍然远远不够接近

3) 如果您每次根据恒定的开始时间(并与 PC 时钟同步)调整 TTimer 间隔,您可以将每个时间事件与 PC 时钟相比平均设定的毫秒数

4) 我不知道 TTimer 类是否正确处理 3),但我有一个 TTimer 等效项

5) 为解决 PC 时钟漂移,您需要定期将 PC 时钟与 NTP 服务器同步

6) 我有一个系统,可以将一台好机器上的 PC 时钟永久保持在 +/- 5 毫秒的参考时间(我每分钟调整一次)和一个分辨率为 +/- 2 毫秒的计时器因为机器没有过载(Windows 不是实时操作系统)

7) 我花了很长时间才达到这一点 - 这是您真正需要的,还是您问错了问题?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-23
    • 2018-07-06
    • 1970-01-01
    • 2014-12-09
    • 2014-01-30
    • 2011-05-17
    • 1970-01-01
    • 2023-03-31
    相关资源
    最近更新 更多