diff options
Diffstat (limited to 'Lib/lib-stdwin/WindowSched.py')
-rw-r--r-- | Lib/lib-stdwin/WindowSched.py | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/Lib/lib-stdwin/WindowSched.py b/Lib/lib-stdwin/WindowSched.py new file mode 100644 index 0000000..19be2b1 --- /dev/null +++ b/Lib/lib-stdwin/WindowSched.py @@ -0,0 +1,57 @@ +# Combine a real-time scheduling queue and stdwin event handling. +# Uses the millisecond timer. + +import stdwin +from stdwinevents import WE_TIMER +import WindowParent +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 = stdwin.pollevent() + if event: + WindowParent.Dispatch(event) + return + # + # Use millisleep for very short delays or if there are no windows + # + if msecs < 100 or WindowParent.CountWindows() = 0: + time.millisleep(msecs) + return + # + # Post a timer event on an arbitrary window and wait for it + # + window = WindowParent.AnyWindow() + window.settimer(msecs/100) + event = stdwin.getevent() + window.settimer(0) + if event[0] <> WE_TIMER: + WindowParent.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 WindowParent.CountWindows() = 0 + +# Run until there is nothing left to do +# +def run(): + while not empty(): + if q.empty(): + WindowParent.Dispatch(stdwin.getevent()) + else: + q.run() |