<div dir="ltr">Hi everyone. I am sharing some cross-platform timing I have done, it would be great to hear from you. <div>________________________________________</div><div>For mac I translated this python implementation to free pascal: <a href="https://github.com/pupil-labs/pyuvc/blob/master/pyuvc-source/darwin_time.pxi">https://github.com/pupil-labs/pyuvc/blob/master/pyuvc-source/darwin_time.pxi</a>):<div>```</div><div>unit timestamps.machtime;<br><br>{$mode objfpc}{$H+}<br>{$modeswitch objectivec1}<br>{$linkframework CoreFoundation}<br><br>interface<br><br>type<br>  mach_timebase_info_data_t = record<br>    numer: UInt32;<br>    denom: UInt32;<br>  end;<br>  mach_timebase_info_t = ^mach_timebase_info_data_t;<br><br>function mach_absolute_time: UInt64; cdecl; external name 'mach_absolute_time';<br>function mach_timebase_info(info: mach_timebase_info_t): Integer; cdecl; external name 'mach_timebase_info';<br><br>implementation<br><br>end.</div><div>```<br></div><div><br></div><div>However, I could not test it extensively. But here is some sample code:</div><div><br></div><div>```<br></div><div>uses ctypes,  timestamps.machtime;</div><div>{...}<br></div><div>var<br>  timeConvert: Float = 0.0;<br>//function get_sys_time_monotonic: Float;<br>function ClockMonotonic : Float;<br>var<br>  timeBase: mach_timebase_info_data_t;<br>begin<br>  if timeConvert = 0.0 then begin<br>    mach_timebase_info(@timeBase);<br>    timeConvert :=<br>      (Float(timeBase.numer) / Float(timeBase.denom) / Float(1000000000.0);<br>  end;<br>  Result := mach_absolute_time() * timeConvert;<br>end;      <br></div><div>```<br></div><div>____________________________________________________</div><div>For linux, I am used to clock_gettime (<a href="https://linux.die.net/man/3/clock_gettime">https://linux.die.net/man/3/clock_gettime</a>):</div><div>```<br></div><div>unit timestamps.gnulinux;</div><div>uses Linux, UnixType, Math;</div><div>{...}<br></div>function ClockMonotonic: Float;<br>var<br>  tp: timespec;<br>  a, b : Float;<br>begin<br>  clock_gettime(CLOCK_MONOTONIC, @tp);<br>  a := Float(tp.tv_sec);<br>  b := Float(tp.tv_nsec) * 1e-9;<br>  Result := a+b;<br><div>end;  </div><div>```</div><div>_________________________________________________</div><div>For windows I am used to QueryPerformanceCounter:</div><div>```</div><div>unit timestamps.windows;</div><div>uses Windows, Math;</div><div>{...}</div><div>var<br>  PerSecond : TLargeInteger;</div><div>function ClockMonotonic: Float;<br>var<br>  Count : TLargeInteger;<br>begin<br>  QueryPerformanceCounter(Count);<br>  Result := Float(Count) / Float(PerSecond);<br>end;<br><br>initialization<br>   QueryPerformanceFrequency(PerSecond);<br></div><div>```</div><div>Of course, you don't need any "ToSeconds" conversion if you don't want to.</div></div></div>