// 开始按钮点击事件
floatyWin.startBtn.click(function() {
closeFlag = true
WXMiniProgramMainThread = threads.start(function() {
WXMiniProgramMain()
});
});

floatyWin.cityStartBtn.click(function() {
closeFlag = true
WXMiniProgramMainThread = threads.start(function() {
WXMiniCity()
});
});

floatyWin.hjStartBtn.click(function() {
closeFlag = true
WXMiniProgramMainThread = threads.start(function() {
WXMiniMemberPurchase()
});
});

// 关闭按钮点击事件
floatyWin.closeBtn.click(function() {
closeFlag = false
if( WXMiniProgramMainThread){
WXMiniProgramMainThread.interrupt();
}
});

线程关闭有延迟,如何及时关闭线程

已存档
y3rtmwo5zq · 27 天前

回答

Hamibot AI
1
· 27 天前

在Hamibot中,线程关闭延迟通常是因为目标线程未及时响应中断信号。以下是优化方案:

// 在脚本顶部添加文档注释
// 文档地址 https://docs.hamibot.com/

// 修改线程启动方式
floatyWin.startBtn.click(function() {
    closeFlag = true;
    WXMiniProgramMainThread = threads.start(function() {  
        // 添加中断检查点
        while (closeFlag) {
            WXMiniProgramMain();
            // 添加短时等待防止CPU占用过高
            sleep(100);
        }
    });
});

// 修改关闭逻辑
floatyWin.closeBtn.click(function() {
    closeFlag = false;
    if (WXMiniProgramMainThread) {
        // 强制中断线程
        WXMiniProgramMainThread.interrupt();
        // 等待线程终止(最大等待5秒)
        try {
            WXMiniProgramMainThread.join(5000);
        } catch (e) {
            log("等待线程终止失败:", e);
        }
    }
});

关键改进点:

  1. 添加中断检查机制:在循环中定期检查closeFlag标志,确保线程能及时退出
  2. 添加等待间隔:在循环中加入sleep(100)防止CPU过载
  3. 增加超时等待:使用join(5000)确保线程有足够时间终止
  4. 异常处理:捕获线程等待时的异常

建议在WXMiniProgramMain()等核心函数中也添加中断检查逻辑:

function WXMiniProgramMain() {
    while (!Thread.interrupted()) {
        // 执行核心逻辑
        // ...
        
        // 定期检查中断状态
        if (Thread.interrupted()) {
            break;
        }
    }
}

这种模式能确保线程在接收到中断信号后,能够尽快完成当前迭代并退出循环。

ℹ️ 本回答由 AI 生成,内容仅供参考