Initial revision
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()