# Combine a real-time scheduling queue and stdwin event handling. # Uses the millisecond timer. import stdwin, stdwinq from stdwinevents import WE_TIMER import mainloop import sched import time # Delay function called by the scheduler when it has nothing to do. # Return immediately when something is done, or when the delay is up. # def delayfunc(msecs): # # Check for immediate stdwin event # event = stdwinq.pollevent() if event: mainloop.dispatch(event) return # # Use millisleep for very short delays or if there are no windows # if msecs < 100 or mainloop.countwindows() = 0: if msecs > 0: time.millisleep(msecs) return # # Post a timer event on an arbitrary window and wait for it # window = mainloop.anywindow() window.settimer(msecs/100) event = stdwinq.getevent() window.settimer(0) if event[0] <> WE_TIMER: mainloop.dispatch(event) q = sched.scheduler().init(time.millitimer, delayfunc) # Export functions enter, enterabs and cancel just like a scheduler # enter = q.enter enterabs = q.enterabs cancel = q.cancel # Emptiness check must check both queues # def empty(): return q.empty() and mainloop.countwindows() = 0 # Run until there is nothing left to do # def run(): while not empty(): if q.empty(): mainloop.dispatch(stdwinq.getevent()) else: q.run()