Rather than attempting to guess the refresh rate beforehand, you could work it out at runtime, then use this to drive your main loop - something roughly like...(untested, obviously)
use Time::Hires;
$avg_num=10; # or whatever
$s=time(); #Time::Hires floating-point drop-in
$taxis->taxis() for (0..$avg_num);
$refresh = (time()-$s)/$avg_num;
$refresh = $sensible if ($refresh < $sensible;}
while(1) {
$start=time();
$taxis->taxis();
do {
DoOneEvent( $running ? DONT_WAIT : ALL_EVENTS );
}
until (time()-$start > $refresh);
}
Cheers, Ben.