差異處
這裏顯示兩個版本的差異處。
下次修改 | 前次修改 | ||
wiki:自动化与科技指导:opencomputers:编程规范 [2023/12/08 16:20] – 建立 nikoqw | wiki:自动化与科技指导:opencomputers:编程规范 [2023/12/11 11:33] (目前版本) – [总旨] nikoqw | ||
---|---|---|---|
行 1: | 行 1: | ||
- | <WRAP center round info 60%> | ||
- | 本规范是非强制的,但强烈建议你遵守。 | ||
- | </ | ||
- | |||
====== 编程规范 ====== | ====== 编程规范 ====== | ||
为了能够配合既有代码使用,合理利用服务器资源,所有程序必须遵守本编程规范。 | 为了能够配合既有代码使用,合理利用服务器资源,所有程序必须遵守本编程规范。 | ||
===== 总旨 ===== | ===== 总旨 ===== | ||
- | 开放式电脑的程序需要基于事件驱动、能够“干净”地终止,做到低耦合高内聚、尽量运用库的功能,不要自己实现即有库已实现的功能。 | + | 开放式电脑的程序需要: |
+ | * 基于事件驱动。 | ||
+ | * 如果程序能够被终止(即非除了切断电源才能停止程序),则必须能够 “干净” 地终止。 | ||
+ | * 没有资源(如文件句柄)泄露。 | ||
+ | * 低耦合高内聚、尽量运用库的功能,不要自己实现即有库已实现的功能。 | ||
具体来说,规则如下: | 具体来说,规则如下: | ||
- | * 非后台程序中,使用event.pull系列函数处理事件。只有后台程序才可以使用event.listen函数。 | + | |
- | * 无论是否为后台程序,键鼠事件必须使用event.pull系列函数处理。目的是为了退出程序后键鼠事件不再被处理。 | + | |
- | * 如无特殊要求,使用local变量和函数。 | + | * 无论是否为后台程序,键鼠事件必须使用 |
- | * 必须能够处理interrupted事件,非后台程序中,处理的行为是注销所有事件、定时器、文件句柄等,然后退出整个程序;后台程序中,处理的行为是简单地退出。 | + | * 必须能够处理 interrupted 事件,非后台程序中,处理的行为是注销所有事件、定时器、文件句柄等,然后退出整个程序;后台程序中,处理的行为是简单地退出。 |
- | * 后台程序中,必须监听一个事件。该事件触发后能注销所有事件、定时器、文件句柄等,从而“干净”地退出后台程序。 | + | * 后台程序必须监听一个事件。该事件触发后能注销所有事件、定时器、文件句柄等,从而 “干净” 地退出后台程序。 |
- | * 后台程序中,必须监听一个事件。该事件触发后能让后台程序恢复显示和处理键鼠事件。 | + | * 后台程序必须监听一个事件。该事件触发后能让后台程序恢复显示和处理键鼠事件。 |
===== 示例 ===== | ===== 示例 ===== | ||
- | **1.1 一个简单的前台程序** | + | 建议您在编写 OpenComputer 程序时,直接复制示例中的代码作为开始模板,然后在此基础上实现您的逻辑。 |
+ | ====1.1. 一个简单的前台程序==== | ||
<code LUA> | <code LUA> | ||
local timer = event.timer(1000, | local timer = event.timer(1000, | ||
行 38: | 行 39: | ||
</ | </ | ||
- | **1.2 一个稍微复杂的前台程序** | + | ====1.2. 一个稍微复杂的前台程序==== |
<code LUA> | <code LUA> | ||
local timer = event.timer(1000, | local timer = event.timer(1000, | ||
行 60: | 行 61: | ||
[" | [" | ||
print(" | print(" | ||
- | -- 这儿不能退出!在filter函数之中要返回true表示事件被处理了,然后在pullFiltered调用之外退出。 | + | -- 这儿不能退出!在 filter 函数之中要返回 true 表示事件被处理了,然后在 pullFiltered 调用之外退出。 |
ifTerminate = true; -- 标记事件处理结束后退出 | ifTerminate = true; -- 标记事件处理结束后退出 | ||
end | end | ||
行 81: | 行 82: | ||
- | **2. 后台程序** | + | ====2. 后台程序==== |
<WRAP center round box 60%> | <WRAP center round box 60%> | ||
在没有多任务操作系统的情况下编写在后台运行的程序是很麻烦、很原始的。您需要完全手动处理应用程序切入后台、恢复前台的所有逻辑,就如同在 DOS 中一样。< | 在没有多任务操作系统的情况下编写在后台运行的程序是很麻烦、很原始的。您需要完全手动处理应用程序切入后台、恢复前台的所有逻辑,就如同在 DOS 中一样。< | ||
</ | </ | ||
<WRAP center round alert 60%> | <WRAP center round alert 60%> | ||
- | 本代码没有经过实际测试,应该无法符合预期运作。本代码的作用仅仅是供您参考和学习操作系统原理,以及给予一个在OC中的bare bones的多任务的大致实现和思想。 | + | 本代码没有经过实际测试,应该无法符合预期运作。本代码的作用仅仅是供您参考和学习操作系统原理,以及给予一个在 OC 中的 bare bones 的多任务的大致实现和思想。 |
</ | </ | ||
行 97: | 行 98: | ||
end); | end); | ||
- | local pullInputThread = nil; -- 一个处理输入事件的“线程”——只执行一次的timer | + | local pullInputThread = nil; -- 一个处理输入事件的 “线程” ——只执行一次的 timer |
local redstoneEventHandler = event.listen(" | local redstoneEventHandler = event.listen(" | ||
行 103: | 行 104: | ||
end); | end); | ||
- | -- 监听将程序至于后台/ | + | -- 监听将程序至于后台 / 前台的键盘事件 |
local hideShowKeyEventHandler = event.listen(" | local hideShowKeyEventHandler = event.listen(" | ||
-- 如果按下小键盘0,唤起应用 | -- 如果按下小键盘0,唤起应用 | ||
行 110: | 行 111: | ||
event.push(" | event.push(" | ||
- | -- 如果按下小键盘1,完全终止应用 | + | -- 如果按下小键盘 1,完全终止应用 |
elseif char == keyboard.keys.numpad1 then | elseif char == keyboard.keys.numpad1 then | ||
terminate(); | terminate(); | ||
end); | end); | ||
- | -- 如果收到hide_all_programs信号,隐藏自己。 | + | -- 如果收到 hide_all_programs 信号,隐藏自己。 |
local hideAllProgramsEventHandler = event.listen(" | local hideAllProgramsEventHandler = event.listen(" | ||
hide(); | hide(); | ||
行 123: | 行 124: | ||
function hide() | function hide() | ||
ifHide = true; | ifHide = true; | ||
- | event.cancel(pullInputThread); | + | event.cancel(pullInputThread); |
os.exit(0); | os.exit(0); | ||
end | end | ||
行 130: | 行 131: | ||
function show() | function show() | ||
ifHide = false; | ifHide = false; | ||
- | dumpOutBuffer(); | + | dumpOutBuffer(); |
- | pullInputThread = event.timer(0, | + | pullInputThread = event.timer(0, |
end | end | ||
行 138: | 行 139: | ||
event.cancel(timer); | event.cancel(timer); | ||
event.ignore(redstoneEventHandler); | event.ignore(redstoneEventHandler); | ||
- | event.ignore(hideShowKeyEventHandler); | + | event.ignore(hideShowKeyEventHandler); |
- | event.ignore(hideAllProgramsEventHandler); | + | event.ignore(hideAllProgramsEventHandler); |
end | end | ||