使用电子助手器或电子封装器后我遇到了问题,我相信问题出在asar上。如果我用electron .
执行代码它可以很好地工作,但是如果我使用电子构建器或电子打包器构建可执行文件,当我调用子进程时它会打开另一个程序实例,而不是做什么是预期的。
当我点击“转换器”按钮时,它开始按预期将.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);
});
});
答案 0 :(得分:1)
我意识到子进程在asar包中不起作用,所以我将子进程更改为后台窗口,我可以在不冻结UI的情况下运行函数(这就是我尝试使用子进程的原因) ),最终它作为一个儿童过程。
<强> 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!");
}
});
所以我向主要发送消息,主要发送到用户界面或背景进程,它就像魔术一样。
答案 1 :(得分:0)
你不应该产生process.execPath,通常你会产生&#34; node&#34;。
let c1 = cp.spawn('node', [__dirname + '/child.js'], {
stdio: ['inherit', 'inherit', 'inherit', 'ipc']
}