Ssyncronous timers can be useful in this case, unless you directly move to a multithreaded environment, where all problems due to time spent by the system in othere activities can be excluded. The example I posted in this other thread of yours can be easily modified adding Sleep in the loop(s) to verify the behaviour of the function in various situations (sleep policy and presence of ProcessSystemEvents).
While running a brief, single-threaded example I have verified that the process time is directly dependent on how fast you call Sleep: i.e. there is a systematic error on timing due to processor activity.