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 | |
Guido van Rossum | 0d3f467 | 1991-08-16 13:22:53 +0000 | [diff] [blame] | 4 | import stdwin, stdwinq |
Guido van Rossum | 2d844d1 | 1991-04-07 13:41:50 +0000 | [diff] [blame] | 5 | from stdwinevents import WE_TIMER |
Guido van Rossum | 0d3f467 | 1991-08-16 13:22:53 +0000 | [diff] [blame] | 6 | import mainloop |
Guido van Rossum | 2d844d1 | 1991-04-07 13:41:50 +0000 | [diff] [blame] | 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 | # |
Guido van Rossum | 0d3f467 | 1991-08-16 13:22:53 +0000 | [diff] [blame] | 17 | event = stdwinq.pollevent() |
Guido van Rossum | 2d844d1 | 1991-04-07 13:41:50 +0000 | [diff] [blame] | 18 | if event: |
Guido van Rossum | 0d3f467 | 1991-08-16 13:22:53 +0000 | [diff] [blame] | 19 | mainloop.dispatch(event) |
Guido van Rossum | 2d844d1 | 1991-04-07 13:41:50 +0000 | [diff] [blame] | 20 | return |
| 21 | # |
| 22 | # Use millisleep for very short delays or if there are no windows |
| 23 | # |
Guido van Rossum | bdfcfcc | 1992-01-01 19:35:13 +0000 | [diff] [blame] | 24 | if msecs < 100 or mainloop.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 | # |
Guido van Rossum | 0d3f467 | 1991-08-16 13:22:53 +0000 | [diff] [blame] | 31 | window = mainloop.anywindow() |
Guido van Rossum | 2d844d1 | 1991-04-07 13:41:50 +0000 | [diff] [blame] | 32 | window.settimer(msecs/100) |
Guido van Rossum | 0d3f467 | 1991-08-16 13:22:53 +0000 | [diff] [blame] | 33 | event = stdwinq.getevent() |
Guido van Rossum | 2d844d1 | 1991-04-07 13:41:50 +0000 | [diff] [blame] | 34 | window.settimer(0) |
| 35 | if event[0] <> WE_TIMER: |
Guido van Rossum | 0d3f467 | 1991-08-16 13:22:53 +0000 | [diff] [blame] | 36 | mainloop.dispatch(event) |
Guido van Rossum | 2d844d1 | 1991-04-07 13:41:50 +0000 | [diff] [blame] | 37 | |
Guido van Rossum | 7bc817d | 1993-12-17 15:25:27 +0000 | [diff] [blame] | 38 | q = sched.scheduler(time.millitimer, delayfunc) |
Guido van Rossum | 2d844d1 | 1991-04-07 13:41:50 +0000 | [diff] [blame] | 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(): |
Guido van Rossum | bdfcfcc | 1992-01-01 19:35:13 +0000 | [diff] [blame] | 49 | return q.empty() and mainloop.countwindows() == 0 |
Guido van Rossum | 2d844d1 | 1991-04-07 13:41:50 +0000 | [diff] [blame] | 50 | |
| 51 | # Run until there is nothing left to do |
| 52 | # |
| 53 | def run(): |
| 54 | while not empty(): |
| 55 | if q.empty(): |
Guido van Rossum | 0d3f467 | 1991-08-16 13:22:53 +0000 | [diff] [blame] | 56 | mainloop.dispatch(stdwinq.getevent()) |
Guido van Rossum | 2d844d1 | 1991-04-07 13:41:50 +0000 | [diff] [blame] | 57 | else: |
| 58 | q.run() |