On 26.07.2016 19:05, Dmitry Boyarintsev wrote: > On Tue, Jul 26, 2016 at 12:38 PM, James Richters > <ja...@productionautomation.net <mailto:ja...@productionautomation.net>> > wrote: > > What I need is a timer that I can specify in microseconds, a > millisecond is too long. I am using it for timing to read in a > string on a serial connection. My fastest baudrate is 250000, so at > that rate I would need to delay only 36 microseconds. So I can’t > use sleep () or delay () because they only go down to 1mS and that’s > too slow. > > > Here's an example of Sleep with microseconds that I came up with > > procedure SleepMcs(mcs: Int64); > var > ct : TLargeInteger; > fr : TLargeInteger; > af : TLargeInteger; > trg : TLargeInteger; > const > NanoInMicro = 1000; > begin > QueryPerformanceCounter(ct); > QueryPerformanceFrequency(fr); > trg:=round(mcs * NanoInMicro / (NSInSec/fr)); > repeat > QueryPerformanceCounter(af); > until trg<=(af-ct); > end; > > I'm hoping that there's a better solution out there, because this > procedure will end up with 100% CPU load. > I doubt it's possible to unload the CPU, since the windows scheduler is > in milliseconds accuracy. > May be a lower (kernel/driver) level allows that.
An alternative would be NtDelayExecution from unit jwanative. Its interval argument is in multiples of 100ns and is essentially what Windows' Sleep() uses internally. Note: The first argument "Alertable" determines whether the function can be interrupted by NtAlertThread (and whatever Windows API functions use that internally). Regards, Sven _______________________________________________ fpc-pascal maillist - fpc-pascal@lists.freepascal.org http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal