subprocess打开意外的电子窗口

在使用电子制造商或电子包装商之后,我遇到了一个问题,我相信问题是在这个问题上。 如果我用electron .执行代码electron . 它可以很好地工作,但是如果我使用电子构build器或电子打包器构build一个可执行文件,那么当我调用一个subprocess时,会打开该程序的另一个实例,而不会执行所期望的任务。

用电子。

当我点击“转换器”button,它开始按预期将.xml文件转换为PDF。

内置版本

点击之前

点击后

点击:

 e.onclick = () => { let path = document.getElementById("pasta").files[0].path.replace(/\\/g, '/'); let c1 = cp.spawn(process.execPath, [__dirname + '/child.js'], { stdio: ['inherit', 'inherit', 'inherit', 'ipc'] }); c1.send(path); c1.on('message', m => { if(m.name === 'start') { document.getElementById("start").className += " disabled"; } if(m.name === 'process') { document.getElementById("bar").style.width = m.data + "%"; } if(m.name === 'end') { document.getElementById("start").className = document.getElementById("start").className.replace(" disabled", ''); document.getElementById("bar").style.width = "0%"; window.alert("Conversão relizada com sucesso!"); } }); } 

Child.js

 'use strict'; const pdf = require('../pdfCreator.js'); const timer = require('timers'); process.on('message', m => { let path = m; process.send({name: 'start'}); pdf.readDir(path, status => { let percent = parseInt((status.now/status.total) * 100); process.send({name: 'process', data: percent}); }, () => { timer.setTimeout(() => { process.send({name:'end'}); }, 1000); }); }); 

你不应该产生process.execPath,通常你会产生“节点”。

 let c1 = cp.spawn('node', [__dirname + '/child.js'], { stdio: ['inherit', 'inherit', 'inherit', 'ipc'] } 

我怎么样这样

我意识到,subprocess不工作在asar包,所以我改变了subprocess到一个后台窗口,我可以运行的function,而不冻结用户界面(这就是为什么我试图使用subprocess),在结束它作为一个孩子的过程。

Main.js

  win.loadURL(url.format({ pathname: path.join(__dirname, 'app/index.html'), protocol: 'file:', slashes: true })); backgroundWin = new BrowserWindow({show: false}); backgroundWin.loadURL(url.format({ pathname: path.join(__dirname, 'app/process.html'), protocol: 'file:', slashes: true })); ipcMain.on('toUi', (e, m) => { win.webContents.send('message', m); }); ipcMain.on('toProcessor', (e, m) => { backgroundWin.webContents.send('message', m); }); 

Processor.js

 ipcRenderer.on('message', (e, m) => { if(m.type === 'start'){ let path = m.data; ipcRenderer.send('toUi', {type: 'start'}); pdf.readDir(path, status => { let percent = parseInt((status.now/status.total) * 100); ipcRenderer.send('toUi', {type: 'process', data: percent}); }, () => { timer.setTimeout(() => { ipcRenderer.send('toUi', {type:'end'}); }, 1000); }); } }); 

UI.js

 ipcRenderer.on('message', (e, m) => { console.log(m); if(m.type === 'start') { document.getElementById("start").className += " disabled"; } if(m.type === 'process') { document.getElementById("bar").style.width = m.data + "%"; } if(m.type === 'end') { document.getElementById("start").className = document.getElementById("start").className.replace(" disabled", ''); document.getElementById("bar").style.width = "0%"; window.alert("Conversão relizada com sucesso!"); } }); 

所以我发送一个消息给主,主要发送到用户界面或后台进程,它的作用是魔术。

Git回购 。