Execute events until the queue is empty.
When there is a positive delay until the first event, the delay
function is called and the event is left in the queue; otherwise, the
event is removed from the queue and executed (its action function is
called, passing it the argument). If the delay function returns
prematurely, it is simply restarted.
It is legal for both the delay function and the action function to to
modify the queue or to raise an exception; exceptions are not caught but
the scheduler's state remains well-defined so run() may be called
again.
A questionably hack is added to allow other threads to run: just after
an event is executed, a delay of 0 is executed, to avoid monopolizing the
CPU when other threads are also runnable.
|