| # Combine a real-time scheduling queue and stdwin event handling. |
| # Keeps times in milliseconds. |
| |
| 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): |
| msecs = int(msecs) |
| # |
| # Check for immediate stdwin event |
| # |
| event = stdwinq.pollevent() |
| if event: |
| mainloop.dispatch(event) |
| return |
| # |
| # Use sleep for very short delays or if there are no windows |
| # |
| if msecs < 100 or mainloop.countwindows() == 0: |
| if msecs > 0: |
| time.sleep(msecs * 0.001) |
| 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) |
| |
| def millitimer(): |
| return time.time() * 1000 |
| |
| q = sched.scheduler(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() |