Guido van Rossum | 2d844d1 | 1991-04-07 13:41:50 +0000 | [diff] [blame] | 1 | # Combine a real-time scheduling queue and stdwin event handling. |
Guido van Rossum | b6775db | 1994-08-01 11:34:53 +0000 | [diff] [blame^] | 2 | # Keeps times in milliseconds. |
Guido van Rossum | 2d844d1 | 1991-04-07 13:41:50 +0000 | [diff] [blame] | 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 | # |
Guido van Rossum | b6775db | 1994-08-01 11:34:53 +0000 | [diff] [blame^] | 22 | # Use sleep for very short delays or if there are no windows |
Guido van Rossum | 2d844d1 | 1991-04-07 13:41:50 +0000 | [diff] [blame] | 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: |
Guido van Rossum | b6775db | 1994-08-01 11:34:53 +0000 | [diff] [blame^] | 26 | time.sleep(msecs * 0.001) |
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 | b6775db | 1994-08-01 11:34:53 +0000 | [diff] [blame^] | 38 | def millitimer(): |
| 39 | return int(1000 * time.time()) |
| 40 | |
| 41 | q = sched.scheduler(millitimer, delayfunc) |
Guido van Rossum | 2d844d1 | 1991-04-07 13:41:50 +0000 | [diff] [blame] | 42 | |
| 43 | # Export functions enter, enterabs and cancel just like a scheduler |
| 44 | # |
| 45 | enter = q.enter |
| 46 | enterabs = q.enterabs |
| 47 | cancel = q.cancel |
| 48 | |
| 49 | # Emptiness check must check both queues |
| 50 | # |
| 51 | def empty(): |
Guido van Rossum | bdfcfcc | 1992-01-01 19:35:13 +0000 | [diff] [blame] | 52 | return q.empty() and mainloop.countwindows() == 0 |
Guido van Rossum | 2d844d1 | 1991-04-07 13:41:50 +0000 | [diff] [blame] | 53 | |
| 54 | # Run until there is nothing left to do |
| 55 | # |
| 56 | def run(): |
| 57 | while not empty(): |
| 58 | if q.empty(): |
Guido van Rossum | 0d3f467 | 1991-08-16 13:22:53 +0000 | [diff] [blame] | 59 | mainloop.dispatch(stdwinq.getevent()) |
Guido van Rossum | 2d844d1 | 1991-04-07 13:41:50 +0000 | [diff] [blame] | 60 | else: |
| 61 | q.run() |