Files
CCT_Multishell/README.md
2026-01-30 23:40:27 +08:00

99 lines
3.8 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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