Длительные процессы, которые блокируют основной процесс Chromium, также блокируют рендерер.
Решение состоит в том, чтобы создать отдельный процесс и отправить ему обновления статуса обратно в рендерер через IPC:
this._service = fork(
path.join(__dirname, 'service'),
[],
{ stdio: ['inherit', 'inherit', 'inherit', 'ipc'] }
);
this._service.on('error', (err) => {
console.log('child error', err);
});
this._service.on('message', msg => {
console.log('message from child:', msg);
switch (msg.cmd) {
case 'hello':
console.log('hello from parent');
break;
case 'log':
this.parentLog(msg.html);
break;
case 'progress':
this.progressBar.update(msg.pc);
break;
}
});
В порожденном подпроцессе (с именем service.js
в вышеприведенном примере) используйте process.send
для передачи JSON родительскому элементу:
const childLog = (html) => {
process.send({ cmd: 'log', html: html });
}
Обратите внимание, что если ваш родитель не является средством визуализации Electron, это может быть доступ к DOM через window
, переданный от средства визуализации.