【问题标题】:Delphi gettimeofday for OSX (equivalent for timeGetTime under win)Delphi gettimeofday for OSX(相当于win下的timeGetTime)
【发布时间】:2013-02-27 03:45:52
【问题描述】:

我正在转换一个线程计时器池单元以供跨平台使用。 当前单元使用 timeGetTime 来确保高精度,并在调用计时器事件时报告实际经过的时间间隔。

我之前在 OSX 中使用 gettimeofday 来获得高分辨率计时器,但找不到任何在 Delphi XE3 中使用的参考。

寻求有关如何在 Delphi 中调用它的帮助,或者寻求一种替代的跨平台方式来获得高分辨率计时器。为此,我需要毫秒精度(我知道它依赖于操作系统)。

提前致谢,马丁

【问题讨论】:

    标签: macos delphi timer cross-platform delphi-xe3


    【解决方案1】:

    一个更好的选择,多平台准备,可能是使用来自System.Diagnostics 单元的TStopWatch 记录。

    如果可用,TStopWatch 是真正的高分辨率计时器,在这种情况下具有接近纳秒的精度(取决于操作系统和硬件),如果不可用(在 Windows 中),则使用标准计时器函数来提供毫秒精度.

    如果您只需要毫秒精度,请使用 ElapsedMilliseconds 属性,如下所示:

    var
      sw : TStopWatch;
      ElapsedMilliseconds : Int64;
    begin
      sw := TStopWatch.Create() ;
      try
        sw.Start;
        Whatever();
        sw.Stop;
    
        ElapsedMilliseconds := sw.ElapsedMilliseconds;
      finally
        sw.Free;
      end;
    end;
    

    TStopWatch 依赖于 windows 中的 QueryPreformanceFrequency/QueryPerformanceCounter 函数和 OS-X 上的 mach_absolute_time

    【讨论】:

    • 这依赖于停止 TStopWatch,然后才能读取经过的时间。要将其用作高分辨率事件计时器(相当于 TTimer),使用接口中提供的 getTimeStamp 函数是否安全?
    • @Martin AFAIK 没有必要停止计时器来读取 Elapsed 值,而且关于 GetTimeStamp,它是安全,但可能不是您所期望的。您可以检查 GetTimeStamp 值在记录中的使用方式,并且由于没有记录返回值的单位,恕我直言,将来可能会更改。 IIRC GetTimeStamp 在 XE3 中为 OS-X 和 Win32 返回纳秒。
    • 有趣。您是正确的,在不停止 StopWatch 的情况下读取 Elapsed 确实有效。然而,文档确实说“只有在秒表之前停止时才会更新 Elapsed 的值。在秒表运行时读取 Elapsed 属性不会产生任何差异。”我希望这在未来不是“固定的”。
    猜你喜欢
    • 2011-09-23
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 2011-02-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多