我有一个电子应用程序,用于child_process.exec运行长时间运行的任务.当用户在这些任务期间退出应用程序时,我很难管理.
如果他们退出我的应用程序或点击关闭,子进程将继续运行直到完成,但电子应用程序窗口已关闭并退出.
有没有办法通知用户有进程仍在运行,何时完成然后关闭应用程序窗口?
我所拥有的main.js只是标准代码:
// Quit when all windows are closed.
app.on('window-all-closed', function() {
// On OS X it is common for applications and their menu bar
// to stay active until the user quits explicitly with Cmd + Q
if (process.platform != 'darwin') {
app.quit();
}
});
Run Code Online (Sandbox Code Playgroud)
我应该在某处添加支票吗?
谢谢你的帮助
EDITED
我似乎无法获得它的PID,child_process直到它完成.这是我的child_process代码
var loader = child_process.exec(cmd, function(error, stdout, stderr) {
console.log(loader.pid)
if (error) {
console.log(error.message);
}
console.log('Loaded: ', value);
});
Run Code Online (Sandbox Code Playgroud)
我应该尝试以不同的方式获得它吗?
tjm*_*gis 15
因此,在每个人都发表了很好的评论后,我能够通过一些新增功能来更新我的代码,以便让它发挥作用,因此我会为其他人发布我的更新.
1)从child_process.exec更改为child_process.spawn
var loader = child_process.spawn('program', options, { detached: true })
2)使用Electron ipcRenderer从我的模块与main.js脚本进行通信.这允许我将PID发送到main.js
ipcRenderer.send('pid-message', loader.pid);
ipcMain.on('pid-message', function(event, arg) {
console.log('Main:', arg);
pids.push(arg);
});
Run Code Online (Sandbox Code Playgroud)
3)将这些PID添加到数组中
4)在我的main.js中,我添加了以下代码,以在退出应用程序之前终止数组中存在的任何PID.
// App close handler
app.on('before-quit', function() {
pids.forEach(function(pid) {
// A simple pid lookup
ps.kill( pid, function( err ) {
if (err) {
throw new Error( err );
}
else {
console.log( 'Process %s has been killed!', pid );
}
});
});
});
Run Code Online (Sandbox Code Playgroud)
感谢大家的帮助.
ChildProcessexit当进程完成时发出一个事件 - 如果您跟踪数组中的当前进程,并在exit事件触发后让它们自行删除,那么您应该能够在退出应用程序时刚刚foreach运行剩余的进程ChildProcess.kill()。
这可能不是 100% 的工作代码/不是最好的做事方式,因为我现在无法测试它,但它应该足以让你走上正确的道路。
var processes = [];
// Adding a process
var newProcess = child_process.exec("mycommand");
processes.push(newProcess);
newProcess.on("exit", function () {
processes.splice(processes.indexOf(newProcess), 1);
});
// App close handler
app.on('window-all-closed', function() {
if (process.platform != 'darwin') {
processes.forEach(function(proc) {
proc.kill();
});
app.quit();
}
});
Run Code Online (Sandbox Code Playgroud)
编辑:正如 shreik 在评论中提到的,您也可以将 PID 存储在数组中而不是ChildProcess对象中,然后用于process.kill(pid)杀死它们。可能效率会高一些!
| 归档时间: |
|
| 查看次数: |
8709 次 |
| 最近记录: |