Files
endorphin-tessera-gui/examples/cooperative-tasks.endor
T

88 lines
3.3 KiB
Plaintext

// 协作任务示例:两个 ui.spawn 各自保留执行帧,worker 按指令量子轮转推进。
// 这里刻意重复增量语句,方便看到暂停点;取消不回滚已经发生的 steps 写入,单个原生调用仍是原子边界。
// 每个实例有独立 steps 状态,两个任务不会把局部帧或计数存储混在一起。
class CooperativeWork {
steps: Object
// 普通零参数方法被 spawn 调度后可跨量子继续;每条 increment 更新同一实例的计数。
// 连续语句无需手工 yield,VM 按累计预算暂停,恢复时不会从第一条重放。
function run(self: CooperativeWork): Unit {
self.steps.increment()
self.steps.increment()
self.steps.increment()
self.steps.increment()
self.steps.increment()
self.steps.increment()
self.steps.increment()
self.steps.increment()
self.steps.increment()
self.steps.increment()
self.steps.increment()
self.steps.increment()
self.steps.increment()
self.steps.increment()
self.steps.increment()
self.steps.increment()
self.steps.increment()
self.steps.increment()
self.steps.increment()
self.steps.increment()
self.steps.increment()
self.steps.increment()
self.steps.increment()
self.steps.increment()
self.steps.increment()
self.steps.increment()
self.steps.increment()
self.steps.increment()
self.steps.increment()
self.steps.increment()
self.steps.increment()
self.steps.increment()
self.steps.increment()
self.steps.increment()
self.steps.increment()
self.steps.increment()
self.steps.increment()
self.steps.increment()
self.steps.increment()
self.steps.increment()
self.steps.increment()
self.steps.increment()
self.steps.increment()
self.steps.increment()
self.steps.increment()
self.steps.increment()
self.steps.increment()
self.steps.increment()
self.steps.increment()
self.steps.increment()
self.steps.increment()
self.steps.increment()
self.steps.increment()
self.steps.increment()
self.steps.increment()
self.steps.increment()
self.steps.increment()
self.steps.increment()
self.steps.increment()
self.steps.increment()
self.steps.increment()
self.steps.increment()
self.steps.increment()
self.steps.increment()
}
}
// 创建两个独立 owner,虽然 key 都叫 work,也不会相互替换;owner/key 组合才是任务身份。
left = CooperativeWork(ui.state(0))
right = CooperativeWork(ui.state(0))
leftTask = ui.spawn(left,"work",left.run)
rightTask = ui.spawn(right,"work",right.run)
// 状态文字绑定到 Task.status,业务进度可在 Console 查询 left/right 的 steps.value。
leftStatus = TextBlock("")
rightStatus = TextBlock("")
leftStatus.bind("text",leftTask.status)
rightStatus.bind("text",rightTask.status)
page = Page()
page.title = "独立暂停调用"
page.render(Column(24,16,TextBlock("两个任务分别保存执行帧;在 REPL 查看 left.steps.value / right.steps.value",2),leftStatus,rightStatus))