AutoJs6 icon indicating copy to clipboard operation
AutoJs6 copied to clipboard

thread无法中断

Open wenghongtian opened this issue 9 months ago • 2 comments

function runTask(task: TaskType<CustomTask>, isAbort: () => boolean) {
  return new Promise<void>((resolve, reject) => {
    try {
      const thread = threads.start(() => {
        eval(task.taskData.content.jsConfig.content);
      });
      // const execution = engines.execScript(
      //   task.id,
      //   task.taskData.content.jsConfig.content,
      // );
      sleep(2000);
      setInterval(() => {
        if (isAbort()) {
          console.log("任务结束");
          thread.interrupt();
          // execution.getEngine().forceStop();
          resolve();
        }
      }, 1000);
    } catch (e) {
      reject(e);
    }
  });
}

task.taskData.content.jsConfig.content为js代码,里面有个无限循环 调用thread.interrupt()后,eval中的代码还在跑。

求大佬解答

wenghongtian avatar Mar 18 '25 08:03 wenghongtian

遇到楼主相似的问题,停止不了脚本,请问楼主解决了吗?使用threads.shutDownAll() engines.stopAll() exit(), const currentEngineId = engines.myEngine().id engines.all().forEach(engine => { if (engine.id !== currentEngineId) { engine.forceStop() } })都不行

5yurong avatar Jun 29 '25 02:06 5yurong

我使用 AutoJs6 6.6.4 运行如下测试代码, 未能复现问题.

function runTask(task, isAbort) {
    return new Promise((resolve, reject) => {
        try {
            const thread = threads.start(() => {
                eval(`
                    while(1) {
                        console.log(new Date());
                        sleep(1e3);
                    }
                `);
            });
            // const execution = engines.execScript(
            //   task.id,
            //   task.taskData.content.jsConfig.content,
            // );
            sleep(2000);
            let id = setInterval(() => {
                if (isAbort()) {
                    clearInterval(id);
                    console.log("任务结束");
                    thread.interrupt();
                    // execution.getEngine().forceStop();
                    resolve();
                }
            }, 1000);
        } catch (e) {
            reject(e);
        }
    });
}

let start = Date.now();
runTask(null, () => Date.now() - start >= 2000);

如果你的 threads.start 参数中包含复杂逻辑, 可尝试提供关键代码或伪代码.

SuperMonster003 avatar Jul 23 '25 16:07 SuperMonster003