关于arrdiro实现开发软件的更新
按下面的教程,文本坐标txt转shp或kml.exe 软件的更新信息如下:
版本信息地址:https://gtjs-9gjbu0mx.maozi.io/ruanjian/wb2shp.txt
软件下载地址:https://gtjs-9gjbu0mx.maozi.io/ruanjian/文本坐标txt转shp或kml.exe
按下面的教程,键盘鼠标自动化2026.exe 软件的更新信息如下:
版本信息地址:https://gtjs-9gjbu0mx.maozi.io/ruanjian/sbjp.txt
软件下载地址:https://gtjs-9gjbu0mx.maozi.io/ruanjian/键盘鼠标自动化2026.exe
按下面的教程,CAD脚本运行集合.exe 软件的更新信息如下:
版本信息地址:https://gtjs-9gjbu0mx.maozi.io/ruanjian/cad.txt
软件下载地址:https://gtjs-9gjbu0mx.maozi.io/ruanjian/CAD脚本运行集合.exe
刚开时的界面
```bash import win.ui; import web.view; import wsock.tcp.simpleHttpServer; /*DSG{{*/ var winform = win.form(text="文本txt转shp或kml"; right=1024; bottom=768) winform.add() /*}}*/ var wb = web.view(winform); // 使用 /res/ 路径,aardio 会自动通过内置 HTTP 服务加载资源 wb.go("/res/index.html") // 在 show 处指定参数 3 (即 _SW_MAXIMIZE) 实现启动即最大化 winform.show(3/*_SW_MAXIMIZE*/); win.loopMessage(); ```和AI对话,实现软件更新检测
要在 aardio 中实现软件更新检测且不影响主程序的正常使用,最关键的技术点是使用多线程执行网络请求。这样即使网络超时或失败,界面也不会卡死。
你可以将以下代码集成到你的 winform.show() 之前或之后: // 1. 定义当前软件版本号 _APP_VERSION = "1.0.0";
// 2. 启动一个独立线程进行更新检测 thread.invoke( function(winform,_APP_VERSION){ import inet.http; // 导入网络库
// 创建 HTTP 客户端
var http = inet.http();
/*
从你的服务器获取远程版本号(建议是一个简单的 txt 或 json 文件)
注意:这里建议设置较短的超时时间,避免长时间等待
*/
var remoteVersion = http.get("http://您的服务器地址/version.txt");
// 如果获取失败(没联网或服务器宕机),直接退出线程,不干扰用户
if(!remoteVersion){
return;
}
// 去除可能存在的首尾空白字符
remoteVersion = string.trim(remoteVersion);
// 3. 比较版本号(这里使用简单的字符串比较,复杂版本建议用 string.split 拆分比较)
if(remoteVersion > _APP_VERSION){
// 发现新版本,弹出询问对话框(在线程中直接操作 winform 是线程安全的)
if( winform.msgboxTest("发现新版本:" + remoteVersion + '\r\n' + "当前版本:" + _APP_VERSION + '\r\n\r\n' + "是否现在前往下载更新?","软件更新") ){
// 用户点击“确定”,跳转到固定下载地址
raw.execute("https://您的固定下载地址.com");
}
}
},winform,_APP_VERSION // 将窗口对象和版本号传给线程
)
代码要点说明:
- 多线程安全:使用 thread.invoke 开启新线程。在线程内部,你可以安全地调用 winform.msgboxTest 或 winform.show()。
- 静默失败:代码中通过 if(!remoteVersion) return; 确保了如果网络请求失败(例如用户没联网),程序会直接结束检测线程,用户完全感知不到,从而不会影响软件的正常打开和使用。
- 版本文件建议:你的服务器上只需要放一个名为 version.txt 的文件,内容只写版本号数字(例如 1.0.1)即可。
- 跳转下载:使用 raw.execute("网址") 会调用系统默认浏览器打开该页面。
修改后的“选中代码”完整示例如下:
```bash import win.ui; import web.view; import wsock.tcp.simpleHttpServer; /*DSG{{*/ var winform = win.form(text="文本txt转shp或kml"; right=1024; bottom=768) winform.add() /*}}*/ // 定义当前版本 _APP_VERSION = "1.0.0"; var wb = web.view(winform); wb.go("/res/index.html"); // 启动更新检测线程 thread.invoke( function(winform,_APP_VERSION){ import inet.http; var http = inet.http(); // 设置较短的连接超时(毫秒),避免弱网环境下等待太久 http.setTimeouts(2000,2000,2000); var remoteVersion = http.get("http://example.com/version.txt"); // 失败则静默退出 if(!remoteVersion) return; remoteVersion = string.trim(remoteVersion); if(remoteVersion > _APP_VERSION){ if( winform.msgboxTest("发现新版本 " + remoteVersion + ",是否更新?") ){ raw.execute("https://example.com/download"); } } },winform,_APP_VERSION ) winform.show(3/*_SW_MAXIMIZE*/); win.loopMessage(); ```我.... example.com/version.txt该如何写内容
对于你的 version.txt 文件,内容写法建议遵循**“越简单越好”**的原则。
1. 最简单的写法(推荐)
直接在文件中写入版本号数字。不要有任何 HTML 标签,也不要有多余的描述,只留一行版本号。
文件内容示例:
1.0.1
为什么这样写?
在 aardio 代码中,你使用 remoteVersion = string.trim(remoteVersion) 获取内容后,可以直接用它与本地版本号进行比较(例如 if(remoteVersion > _APP_VERSION))。字符串比较规则中 "1.0.1" > "1.0.0" 是成立的。
2. 更规范的写法(JSON 格式)
如果你以后想在弹窗里显示更新了什么内容,建议使用 JSON 格式。
文件内容示例:
{
"version": "1.0.1",
"description": "1. 优化了转换速度\n2. 修复了 KML 导出坐标偏移的问题",
"url": "https://example.com/down/setup.exe"
}
对应的 aardio 代码修改: 如果你用了 JSON 格式,检测更新的代码需要稍微改一下:
thread.invoke(
function(winform,_APP_VERSION){
import inet.http;
import JSON; // 导入 JSON 库
var http = inet.http();
var jsonStr = http.get("http://example.com/version.json");
if(!jsonStr) return; // 没联网直接退出
// 解析 JSON
var verInfo = JSON.parse(jsonStr);
if(!verInfo) return;
if(verInfo.version > _APP_VERSION){
// 弹窗显示更新说明
var msg = "发现新版本:" + verInfo.version + '\r\n'
+ "更新内容:" + '\r\n' + verInfo.description;
if( winform.msgboxTest(msg, "发现更新") ){
// 使用 JSON 里配置的地址跳转
raw.execute(verInfo.url);
}
}
},winform,_APP_VERSION
)
注意事项:
- 文件编码:保存
version.txt时,请确保使用 UTF-8 编码,特别是如果你在里面写了中文更新说明。 - CDN/缓存问题:有些服务器或 CDN 会缓存
.txt文件。如果你更新了服务器上的版本号但软件检测不到,可以在 URL 后面加个随机参数来禁用缓存:var remoteVersion = http.get("http://example.com/version.txt?t=" + tonumber(time())) - 版本号格式:建议始终保持
X.Y.Z的格式(如1.0.0),且位数一致,这样简单的字符串比较>就能准确判断。
报错
这个错误是因为你在 thread.invoke 的线程启动函数中,将 常量 _APP_VERSION 作为了 形参(参数名)。
1. 错误原因分析
在 aardio 中,以下划线开头的标识符(如 _APP_VERSION)被视为 常量。
- 语法规则: 常量不能作为函数的形参名,因为形参本质上是局部变量,而常量的值是不可修改且全局(或在特定名字空间内)只读的。
- 报错位置:
function(winform, _APP_VERSION)这一行。编译器期望在这里看到一个普通的变量名(name),但却遇到了常量。
2. 解决方案
将线程函数的形参名修改为普通变量名(例如 version),或者在线程函数内直接访问外部传入的参数。
3. 修改后的代码
```bash import win.ui; import web.view; import wsock.tcp.simpleHttpServer; /*DSG{{*/ var winform = win.form(text="文本txt转shp或kml"; right=1024; bottom=768) winform.add() /*}}*/ // 定义当前版本(下划线开头为常量) _APP_VERSION = "0.0.0.3"; var wb = web.view(winform); // 自动启动内嵌 HTTP 服务并加载资源文件 wb.go("/res/index.html"); // 启动更新检测线程 thread.invoke( function(winform, version){ // 这里将形参名改为 version import inet.http; var http = inet.http(); // 设置较短的连接超时(毫秒) http.setTimeouts(2000, 2000, 2000); var remoteVersion = http.get("https://gtjs-9gjbu0mx.maozi.io/ruanjian/wb2shp.txt"); // 失败则静默退出 if(!remoteVersion) return; remoteVersion = string.trim(remoteVersion); // 使用传入的 version 与远程版本对比 if(remoteVersion > version){ if( winform.msgboxTest("发现新版本 " + remoteVersion + ", 是否更新?") ){ import process; process.execute("https://gtjs-9gjbu0mx.maozi.io/ruanjian/文本坐标txt转shp或kml.exe"); } } }, winform, _APP_VERSION // 这里将常量值传进去 ) winform.show(3/*_SW_MAXIMIZE*/); win.loopMessage(); ```4. 关键改进点:
- 修复语法错误: 将
function(winform, _APP_VERSION)改为function(winform, version)。 - 更正 API 调用: 原代码中的
raw.execute通常用于调用 DLL 函数。如果是打开网址或运行文件,在界面线程通常用raw.execute(实际上底层是 ShellExecute),但在线程中推荐导入process库并使用process.execute,或者直接用全局函数execute。 - 常量理解: 在 aardio 中,常量一旦定义就不能被修改。在多线程中,虽然可以通过参数传递常量的值,但接收该值的变量必须是普通变量。
温馨提示:
由于你的工程中使用了 wb.go("/res/index.html"),请确保工程管理器中 res 目录的 "内嵌" (embed) 属性已设为 true,这样发布后网页才能正常打包进 EXE。