I think that's good enough. What I've ever made is only using a combination of Sleep(1), Now() and MilliSecondSpan(). Code:
StartTime := Now;
while Process.Running and (MilliSecondSpan(StartTime,Now) < Threshold) do Sleep(1);
// at this point, either the process has died or the time is out