Sciter执行js超过20秒超时(七)
原文:https://sciter.com/forums/topic/assertion-failed-when-call_function-invokes/

Sciter 设有 20 秒的内置超时机制。如果方法未在20 秒内返回结果,sciter 会将其视为失败
前言
Sciter 是一个高质量但小众的嵌入式 UI 引擎,适合追求性能、体积和原生集成的桌面应用开发者。
我觉得 Sciter 比较有意思,它很小众,是闭源的,商用需要许可。它是Andrew Fedoniouk开发维护,Andrew获得了物理学和应用数学硕士学位以及艺术文凭。他的职业生涯始于俄罗斯航空航天工业的研究员。这种跨领域背景使他既具备深厚的技术功底,又懂得用户界面设计的艺术。
- Sciter官网:https://sciter.com/
2025-11-15 sciter-js-sdk最新版v6.0.2.28 - lingkang官网:https://lingkang.top/
sciter当你将大量的逻辑放到js中执行,超过20秒会超时,无法设置,源码写死的!开发的坑来了,这个就是之一。
引发原因
原因:编写复杂逻辑在前端js的方法fun中,将这个方法fun传入c++后端线程执行,超过20秒会自己失败。找了半天发现sciter内置20秒javascript超时失败导致。
- 前端伪代码如下
const json={name:'lingkang'}
Window.this.mainWindow.runTask(json, function (json, status) {
// json --> {name:'lingkang'} 前端--> c++ -->当前方法线程
// status --> c++的status类对象包装
// 复杂逻辑 处理时间超过 20s
})
- c++伪代码如下
SOM_PASSPORT_BEGIN(mainWindow)
SOM_FUNCS(
SOM_FUNC(runTask),
)
SOM_PASSPORT_END
// 线程方法
bool runTask(sciter::value json, sciter::value fun) {
std::thread aa([json, fun]() {
std::wcout << L" 启动线程" << std::endl;
sciter::value status_ = sciter::value::wrap_asset(&status);
status_.isolate();
fun.call(json, status_);// 默认情况下超过20秒会自己失败并释放变量,要注意处理时间
status_.clear();
std::wcout << L" 线程结束" << std::endl;
});
aa.detach();// 剥离线程
return true;
}
解决方案
(1)复杂但可靠(切换js执行器)
- 另外引入
quickjs-ng: https://github.com/quickjs-ng/quickjs - 自己写代码复杂
(2)简单但不可靠(白嫖推荐)
直接修改dll的二进制数据,但不可靠,可能导致其他脚本执行超时或其他问题。
- 下载安装:
HxDhttps://mh-nexus.de/en/hxd/ 拖到下面下载页面:https://mh-nexus.de/en/downloads.php?product=HxD20 - 使用的dll是
sciter-js-sdk-main\bin\windows.d2d\x32\sciter.dll因为较小,修改二进制影响更小。


- 已知当前版本是
2025-11-15 sciter-js-sdk最新版v6.0.2.28当脚本执行超过 20s会超时。 20s转化为二进制是20 4E 00 00(HxD字节序列是反过来的,不知道为什么)。- 将他修改为
6000s就是5B 8D 80 00(HxD字节序列是反过来的,不知道为什么) - 如果你想修改为其他就自行转换,注意
HxD字节序列是反过来的,不知道为什么
打开HxD选择 sciter-js-sdk-main\bin\windows.d2d\x32\sciter.dll ,Ctrl + R 快捷键直接查找修改,选择字节序列 搜索方向选择从头,再点击全部替换,最后按 Ctrl +S 保存即可。

其实当前版本只有8个数据是 20000 如果你有耐心可以一个个修改测试(建议)。
(3)冲钱买商业源码修改(深度玩家)
购买基础款商业授权,会有源码给你。直接修改编译。
本文出自凌康 http://lingkang.top