# Multishell 模块增强版 ## 概述 `multishell` 是 ComputerCraft 中用于支持多任务并发执行的核心模块。它通过在终端顶部显示标签页(tab bar)的方式,允许用户同时运行多个程序,并在它们之间自由切换。本增强版本在原版基础上新增了多项功能,显著提升了多进程管理的灵活性和可用性。 --- ## 新增功能亮点 ### 1. **高级进程启动接口:`newlaunch`** 新增 `multishell.newlaunch(options)` 函数,提供更灵活的进程启动方式: - **支持直接运行函数**:除了传统的程序路径 (`path`),现在可以直接传入一个 Lua 函数 (`func`) 来执行。 - **精细化控制选项**: - `hideTab`: 启动时隐藏该进程的标签页,适用于后台服务或辅助进程。 - `autoClose`: 程序结束后自动关闭,无需用户按任意键确认,提升自动化脚本体验。 - **参数与环境隔离**:每个进程拥有独立的 `env` (环境) 和 `args` (参数) 表,确保沙箱安全。 ```lua -- 示例:启动一个隐藏的后台计时器 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()`**: 返回一个包含所有进程信息的列表,便于构建进程管理器或监控工具。 ```lua -- 示例:列出所有正在运行的进程及其状态 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` 模块一样,`multishell` API 并非全局可用。它仅在由 `multishell` 启动的 shell 环境中被注入。因此,无法通过 `os.loadAPI` 在其他环境中加载此 API。 - **进程 ID 的不稳定性**:进程 ID 对应于其在标签列表中的位置。当其他进程被关闭时,后续进程的 ID 会发生变化。请勿长期保存 ID,而应在每次操作前重新获取。 - **版权与许可**:本代码基于 Daniel Ratcliffe 于 2017 年创作的原始 `multishell` 模块,并遵循 `LicenseRef-CCPL` 许可证。 --- ## 使用示例 ### 启动一个自动关闭的 Hello World 程序 ```lua id = multishell.newlaunch({ path = "/rom/programs/fun/hello.lua", autoClose = true, args = {} }) ``` ### 启动一个后台隐藏的音频播放器(speaker) ```lua id = multishell.newlaunch({ path = "/rom/programs/fun/speaker.lua", args = {"play","audio.dfpwm"} hideTab = true, autoClose = true, }) ``` 这些新功能极大地扩展了 `multishell` 的应用场景,使其从一个简单的多任务切换工具,转变为一个功能完备的多进程管理系统。