99 lines
3.8 KiB
Markdown
99 lines
3.8 KiB
Markdown
# 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` 的应用场景,使其从一个简单的多任务切换工具,转变为一个功能完备的多进程管理系统。 |