Multishell 模块增强版
概述
multishell 是 ComputerCraft 中用于支持多任务并发执行的核心模块。它通过在终端顶部显示标签页(tab bar)的方式,允许用户同时运行多个程序,并在它们之间自由切换。本增强版本在原版基础上新增了多项功能,显著提升了多进程管理的灵活性和可用性。
新增功能亮点
1. 高级进程启动接口:newlaunch
新增 multishell.newlaunch(options) 函数,提供更灵活的进程启动方式:
- 支持直接运行函数:除了传统的程序路径 (
path),现在可以直接传入一个 Lua 函数 (func) 来执行。 - 精细化控制选项:
hideTab: 启动时隐藏该进程的标签页,适用于后台服务或辅助进程。autoClose: 程序结束后自动关闭,无需用户按任意键确认,提升自动化脚本体验。
- 参数与环境隔离:每个进程拥有独立的
env(环境) 和args(参数) 表,确保沙箱安全。
-- 示例:启动一个隐藏的后台计时器
local id = multishell.newlaunch({
func = function()
for i = 10, 1, -1 do
print("Countdown:" .. i)
os.sleep(1)
end
print("Time's up!")
end,
hideTab = true,
autoClose = true
})
2. 全面的进程信息查询
新增两个强大的查询函数,让开发者能完全掌控所有运行中的进程:
multishell.getProcessInfo(n): 获取指定进程 ID 的详细信息,包括:- 进程类型 (
Path或Function) - 程序路径或函数引用
- 环境变量、启动参数
- 标题、协程状态 (
running,suspended,dead) hideTab和autoClose状态
- 进程类型 (
multishell.listProcesses(): 返回一个包含所有进程信息的列表,便于构建进程管理器或监控工具。
-- 示例:列出所有正在运行的进程及其状态
for _, info in ipairs(multishell.listProcesses()) do
print(string.format("ID: %d, Title: %s, Status: %s", info.id, info.title, info.status))
end
3. 动态标签页管理:setHideTab
新增 multishell.setHideTab(n, hide) 函数,允许在进程运行期间动态地隐藏或显示其标签页。这为实现复杂的 UI 逻辑(如最小化到托盘、创建无界面后台任务)提供了可能。
4. 进程终止机制:stop
新增 multishell.stop(n) 函数
- 主动向目标进程发送
"terminate"事件,给予其优雅退出的机会。 - 如果进程未响应,会强制跳过“Press any key to continue”提示并进行清理。
- 正确处理菜单可见性和重绘,避免界面残留。
兼容性与注意事项
- API 非全局性:与
shell模块一样,multishellAPI 并非全局可用。它仅在由multishell启动的 shell 环境中被注入。因此,无法通过os.loadAPI在其他环境中加载此 API。 - 进程 ID 的不稳定性:进程 ID 对应于其在标签列表中的位置。当其他进程被关闭时,后续进程的 ID 会发生变化。请勿长期保存 ID,而应在每次操作前重新获取。
- 版权与许可:本代码基于 Daniel Ratcliffe 于 2017 年创作的原始
multishell模块,并遵循LicenseRef-CCPL许可证。
使用示例
启动一个自动关闭的 Hello World 程序
id = multishell.newlaunch({
path = "/rom/programs/fun/hello.lua",
autoClose = true,
args = {}
})
启动一个后台隐藏的音频播放器(speaker)
id = multishell.newlaunch({
path = "/rom/programs/fun/speaker.lua",
args = {"play","audio.dfpwm"}
hideTab = true,
autoClose = true,
})
这些新功能极大地扩展了 multishell 的应用场景,使其从一个简单的多任务切换工具,转变为一个功能完备的多进程管理系统。
Description
Languages
Lua
100%