gpt4 book ai didi

node.js - child_process.on ('close')有时会很慢

转载 作者:行者123 更新时间:2023-12-03 12:33:54 30 4
gpt4 key购买 nike

我有一个 Electron 应用程序,可以打开一个外部程序(在我的情况下为Office),并且必须等待该程序关闭。

我编写的代码效果很好,但有时在程序关闭10或20秒后会触发child_process.on('close')事件。代码是:

const cp = require("child_process");
child = cp.spawn(path/to/Office.exe + ' "' + path/to/myFile.pptx + '"', {shell: true});
child.on('close', function (code) {
//do something
});

在大多数情况下,它会在1或2秒后使用react,这很好,但是有时我最多需要20秒才能收到关闭事件。程序快速关闭(根据任务管理器),但是 Node 似乎在等待某些东西。

我还尝试了 child.on('exit'),使用 cp.exec()调用该程序,并使用 options.stdio: ignore进行生成,因为我认为 Node 可能正在等待 child 的流。但这没什么区别。

有人知道一种加快该过程的安全方法吗?

最佳答案

我已经尝试过您的代码,并且close事件触发器延迟了0.5-2s,我可以说是可以接受的。

但是,并没有发生20s的延迟,但是如果此问题仍然存在,您可以尝试以下方法,其中包括检查spawn pid。

const pidExists = (pid) => {
let pidOk = true;
try {
process.kill(pid, 0);
} catch (e) {
pidOk = false;
}
return pidOk;
};
const cp = require("child_process");
// I added the detach option because we won't need that process anymore since we're following the PID.
let child = cp.spawn(path/to/Office.exe + ' "' + path/to/myFile.pptx + '"', {shell: true, detach: true});
let officePID = child.pid; // this is the spawn pid

setInterval(()=>{
if( pidExists(officePID)){
console.log('file is still open', new Date().getTime());
}else{
console.log('file was closed', new Date().getTime());
process.exit(0);
}
}, 500);

因为您说任务管理器向您显示该程序已关闭,所以这是一种更好的方法。

关于node.js - child_process.on ('close')有时会很慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60408987/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com