Sciter执行js超过20秒超时(七)

原文:https://sciter.com/forums/topic/assertion-failed-when-call_function-invokes/

image-1764517782604

Sciter 设有 20 秒的内置超时机制。如果方法未在20 秒内返回结果,sciter 会将其视为失败

前言

Sciter 是一个高质量但小众的嵌入式 UI 引擎,适合追求性能、体积和原生集成的桌面应用开发者。

我觉得 Sciter 比较有意思,它很小众,是闭源的,商用需要许可。它是Andrew Fedoniouk开发维护,Andrew获得了物理学和应用数学硕士学位以及艺术文凭。他的职业生涯始于俄罗斯航空航天工业的研究员。这种跨领域背景使他既具备深厚的技术功底,又懂得用户界面设计的艺术。

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执行器)

(2)简单但不可靠(白嫖推荐)

直接修改dll的二进制数据,但不可靠,可能导致其他脚本执行超时或其他问题。

image-1764612229801

image-1764611684447

  1. 已知当前版本是 2025-11-15 sciter-js-sdk最新版v6.0.2.28 当脚本执行超过 20s会超时。
  2. 20s转化为二进制是20 4E 00 00(HxD字节序列是反过来的,不知道为什么)。
  3. 将他修改为6000s就是 5B 8D 80 00(HxD字节序列是反过来的,不知道为什么)
  4. 如果你想修改为其他就自行转换,注意HxD字节序列是反过来的,不知道为什么

打开HxD选择 sciter-js-sdk-main\bin\windows.d2d\x32\sciter.dllCtrl + R 快捷键直接查找修改,选择字节序列 搜索方向选择从头,再点击全部替换,最后按 Ctrl +S 保存即可。

image

其实当前版本只有8个数据是 20000 如果你有耐心可以一个个修改测试(建议)。

(3)冲钱买商业源码修改(深度玩家)

购买基础款商业授权,会有源码给你。直接修改编译。

本文出自凌康 http://lingkang.top