设为首页
收藏本站
只需一步,快速开始
AIWORK版块
AIWORK
Portal
付费问答
AIWORK论坛
BBS
刷新问答
AIWORK
»
AIWORK论坛
›
AIWORK主页
›
AIWORK技术交流
›
AIWROK函数没定义就调用脚本直接崩
返回列表
发新帖
AIWROK函数没定义就调用脚本直接崩
QQ896757558
QQ896757558
当前离线
积分
2567
414
主题
193
回帖
2567
积分
管理员
积分
2567
发消息
显示全部楼层
AIWROK函数没定义就调用脚本直接崩
// ============================================================================
// AIWROK 避坑案例 #02(可跑演示):新手最常踩的 5 个坑
// ============================================================================
//
// 这个脚本有什么用?
// ─────────────────
// 新手刚接触 AIWROK 写脚本,90% 都会在这 5 个地方卡住:
// 1. 函数没定义就调用 → 脚本直接崩
// 2. 用 setTimeout → 找不到函数
// 3. 用 Java 网络类 → 报未定义
// 4. 开线程 → API 用错
// 5. 主线程跑完 → 子线程全死
//
// 本脚本模拟一个"真实服务"的启动过程,演示正确写法。
// 运行后会持续输出心跳日志,按【返回键】或【停止】退出。
//
// 怎么用:AIWROK 里直接运行本文件,观察日志输出。
// ============================================================================
// ============================================================================
// 全局变量(坑1:必须在文件最顶部声明)
// ============================================================================
var G = {
running: true,
startTime: 0,
heartbeatCount: 0,
screen: { w: 1080, h: 1920 }
};
// ============================================================================
// Java 类导入(坑3:必须先 importClass 才能用)
// ============================================================================
importClass(java.net.ServerSocket);
importClass(java.net.InetSocketAddress);
importClass(java.net.NetworkInterface);
// ============================================================================
// 工具函数(坑1:必须先定义,后调用)
// ============================================================================
// 获取屏幕尺寸
function initScreen() {
try {
G.screen.w = screen.getScreenWidth();
G.screen.h = screen.getScreenHeight();
} catch (e) {
printl("[WARN] 获取屏幕尺寸失败,使用默认值");
}
printl("[初始化] 屏幕尺寸: " + G.screen.w + "x" + G.screen.h);
}
// 获取本机 IP
function getLocalIP() {
try {
var interfaces = NetworkInterface.getNetworkInterfaces();
while (interfaces.hasMoreElements()) {
var iface = interfaces.nextElement();
if (iface.isLoopback() || !iface.isUp()) continue;
var addresses = iface.getInetAddresses();
while (addresses.hasMoreElements()) {
var addr = addresses.nextElement();
var host = addr.getHostAddress();
if (host.indexOf(":") === -1) { // 只取 IPv4
return host;
}
}
}
} catch (e) {}
return "127.0.0.1";
}
// 格式化运行时长
function formatUptime() {
var elapsed = Math.floor((java.lang.System.currentTimeMillis() - G.startTime) / 1000);
var h = Math.floor(elapsed / 3600);
var m = Math.floor((elapsed % 3600) / 60);
var s = elapsed % 60;
return (h < 10 ? "0" : "") + h + ":" +
(m < 10 ? "0" : "") + m + ":" +
(s < 10 ? "0" : "") + s;
}
// ============================================================================
// 主流程
// ============================================================================
function main() {
printl("═══════════════════════════════════════════════════════════");
printl(" AIWROK 避坑案例 #02 - 新手五大坑演示服务");
printl("═══════════════════════════════════════════════════════════");
printl("");
G.startTime = java.lang.System.currentTimeMillis();
// 阶段1:初始化(模拟真实服务启动流程)
printl("[阶段1/4] 初始化系统...");
java.lang.Thread.sleep(500);
initScreen();
java.lang.Thread.sleep(300);
// 阶段2:网络检测
printl("[阶段2/4] 检测网络环境...");
java.lang.Thread.sleep(500);
var ip = getLocalIP();
printl("[网络] 本机 IP: " + ip);
java.lang.Thread.sleep(300);
// 阶段3:模拟端口检测(坑3 的正确用法演示)
printl("[阶段3/4] 检测端口可用性...");
java.lang.Thread.sleep(500);
try {
var testPort = 32100;
var testSocket = new ServerSocket(testPort);
printl("[端口] " + testPort + " 可用 ✓");
testSocket.close();
} catch (e) {
printl("[端口] " + testPort + " 被占用,尝试下一个...");
testPort++;
}
java.lang.Thread.sleep(300);
// 阶段4:启动完成,进入心跳循环
printl("[阶段4/4] 启动完成,进入运行状态");
printl("");
printl("───────────────────────────────────────────────────────────");
printl(" 服务已启动,按【返回键】或【停止】退出");
printl("───────────────────────────────────────────────────────────");
printl("");
// 坑2 的正确用法:用 runTime.setTimeout 做心跳,不用 setInterval
// 坑5 的正确用法:主线程用递归 setTimeout 保活,不会退出
startHeartbeat();
}
// 心跳函数(坑2+坑5 的正确写法)
function startHeartbeat() {
G.heartbeatCount++;
// 每 3 秒输出一次状态
var uptime = formatUptime();
var memInfo = "";
try {
var runtime = java.lang.Runtime.getRuntime();
var usedMB = Math.floor((runtime.totalMemory() - runtime.freeMemory()) / 1048576);
memInfo = " | 内存: " + usedMB + "MB";
} catch (e) {}
printl("[心跳 #" + G.heartbeatCount + "] 运行时长: " + uptime + memInfo);
// 检查是否该退出(按返回键会设置 G.running = false)
if (!G.running) {
printl("");
printl("═══════════════════════════════════════════════════════════");
printl(" 服务已停止,总运行时长: " + formatUptime());
printl("═══════════════════════════════════════════════════════════");
return;
}
// 递归调用自己(坑2 的正确写法:不用 setInterval)
runTime.setTimeout(startHeartbeat, 3000);
}
// ============================================================================
// 启动
// ============================================================================
main();
// 说明:按 AIWROK 界面上的【停止】按钮即可退出
复制代码
quot
printl
AIWROK
调用
相关帖子
2026-8-31
WSS协议示例 AIWROK 版websocket
2026-9-1
MQTT协议示例AIWROK版
2026-9-2
AIWROK手机执行器MQTT浏览器控端
2026-9-3
AIWROK手机指挥台停止与开始执行器
2026-9-4
MQTT远程本地局域网OCR例子
2026-9-7
本地部署局域网内YOLO自动识别快手图标
2026-9-9
通用找图OCR点字完整脚本骨架
2026-9-10
贝塞尔曲线滑动的实际演示
上一篇:
本地部署局域网内YOLO自动识别快手图标
下一篇:
通用找图OCR点字完整脚本骨架
发表于
5 天前
举报
回复
分享
返回列表
发新帖
本版积分规则
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
黑夜模式
快速发帖
返回列表
返回顶部