AutoJs6
AutoJs6 copied to clipboard
thread无法中断
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中的代码还在跑。
求大佬解答
遇到楼主相似的问题,停止不了脚本,请问楼主解决了吗?使用threads.shutDownAll() engines.stopAll() exit(), const currentEngineId = engines.myEngine().id engines.all().forEach(engine => { if (engine.id !== currentEngineId) { engine.forceStop() } })都不行
我使用 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 参数中包含复杂逻辑, 可尝试提供关键代码或伪代码.