Guido van Rossum | 2d844d1 | 1991-04-07 13:41:50 +0000 | [diff] [blame] | 1 | # Combine a real-time scheduling queue and stdwin event handling. |
| 2 | # Uses the millisecond timer. |
| 3 | |
| 4 | import stdwin |
| 5 | from stdwinevents import WE_TIMER |
| 6 | import WindowParent |
| 7 | import sched |
| 8 | import time |
| 9 | |
| 10 | # Delay function called by the scheduler when it has nothing to do. |
| 11 | # Return immediately when something is done, or when the delay is up. |
| 12 | # |
| 13 | def delayfunc(msecs): |
| 14 | # |
| 15 | # Check for immediate stdwin event |
| 16 | # |
| 17 | event = stdwin.pollevent() |
| 18 | if event: |
| 19 | WindowParent.Dispatch(event) |
| 20 | return |
| 21 | # |
| 22 | # Use millisleep for very short delays or if there are no windows |
| 23 | # |
| 24 | if msecs < 100 or WindowParent.CountWindows() = 0: |
Guido van Rossum | 001fa6a | 1991-04-21 19:31:10 +0000 | [diff] [blame] | 25 | if msecs > 0: |
| 26 | time.millisleep(msecs) |
Guido van Rossum | 2d844d1 | 1991-04-07 13:41:50 +0000 | [diff] [blame] | 27 | return |
| 28 | # |
| 29 | # Post a timer event on an arbitrary window and wait for it |
| 30 | # |
| 31 | window = WindowParent.AnyWindow() |
| 32 | window.settimer(msecs/100) |
| 33 | event = stdwin.getevent() |
| 34 | window.settimer(0) |
| 35 | if event[0] <> WE_TIMER: |
| 36 | WindowParent.Dispatch(event) |
| 37 | |
| 38 | q = sched.scheduler().init(time.millitimer, delayfunc) |
| 39 | |
| 40 | # Export functions enter, enterabs and cancel just like a scheduler |
| 41 | # |
| 42 | enter = q.enter |
| 43 | enterabs = q.enterabs |
| 44 | cancel = q.cancel |
| 45 | |
| 46 | # Emptiness check must check both queues |
| 47 | # |
| 48 | def empty(): |
| 49 | return q.empty() and WindowParent.CountWindows() = 0 |
| 50 | |
| 51 | # Run until there is nothing left to do |
| 52 | # |
| 53 | def run(): |
| 54 | while not empty(): |
| 55 | if q.empty(): |
| 56 | WindowParent.Dispatch(stdwin.getevent()) |
| 57 | else: |
| 58 | q.run() |