|
// retoor <retoor@molodetz.nl>
|
|
import "scheduler" for Scheduler
|
|
import "timer" for Timer
|
|
|
|
class TaskQueue {
|
|
construct new() {
|
|
_tasks = []
|
|
_running = true
|
|
}
|
|
|
|
add(name, duration) {
|
|
System.print("[Queue] Adding task: \%(name) (\%(duration)ms)")
|
|
_tasks.add({
|
|
System.print("[Worker] Starting \%(name)...")
|
|
Timer.sleep(duration)
|
|
System.print("[Worker] Finished \%(name).")
|
|
})
|
|
}
|
|
|
|
start() {
|
|
System.print("[Queue] Starting task runner...")
|
|
Fiber.new {
|
|
while (_running) {
|
|
if (!_tasks.isEmpty) {
|
|
var task = _tasks.removeAt(0)
|
|
task.call()
|
|
}
|
|
Timer.sleep(100) // Yield to other fibers
|
|
}
|
|
}.call()
|
|
}
|
|
|
|
stop() { _running = false }
|
|
}
|
|
|
|
var queue = TaskQueue.new()
|
|
|
|
// Start the worker in the background
|
|
queue.start()
|
|
|
|
// Add some tasks from the main thread
|
|
queue.add("Task A", 1500)
|
|
queue.add("Task B", 500)
|
|
queue.add("Task C", 1000)
|
|
|
|
System.print("[Main] All tasks queued. Main fiber is free.")
|
|
|
|
// Keep the main loop alive for a bit to see the output
|
|
Timer.sleep(4000)
|
|
queue.stop()
|
|
System.print("[Main] Shutdown.")
|