Electron父进程打开多个子窗口时崩溃问题求助
Electron父进程打开3+子窗口后崩溃的解决办法
问题原因
你使用ipcRenderer.sendSync发起同步IPC调用创建窗口,但主进程的ipcMain处理函数没有返回任何响应。同步IPC调用会阻塞渲染进程,且Electron默认限制了同步IPC的并发数(通常为3个),当积压的未响应同步请求达到上限时,主进程就会挂起崩溃。
解决方案
1. 改用异步IPC调用(推荐)
打开窗口不需要同步等待结果,用ipcRenderer.send替代sendSync,不会阻塞进程,也不会占用同步IPC队列:
渲染进程代码修改:
var openClient = (id) =>{ ipcRenderer.send('openNewWindow', { html: "./elements/components/equipo.html", query: { id : id } }) }
主进程代码可保持不变,若需要通知渲染进程窗口创建状态,可添加回复逻辑:
ipcMain.on('openNewWindow', function(event, arg) { const windowEEE = new BrowserWindow({ center: true, width: 1024, height: 720, minWidth: 1024, minHeight: 720, icon: __dirname + '/resources/iconos/support.png', webPreferences: { nodeIntegration: true, contextIsolation: false, enableRemoteModule: true } }) windowEEE.loadFile(arg.html, {query: arg.query}) // 可选:回复渲染进程窗口创建成功 event.reply('openNewWindow-reply', { success: true }) });
渲染进程监听回复:
ipcRenderer.on('openNewWindow-reply', (event, result) => { console.log('窗口创建完成:', result) })
2. 若必须用同步调用,需返回响应
如果业务场景确实需要同步获取结果,必须在主进程处理函数中调用event.returnValue返回响应,避免IPC队列积压:
主进程代码修改:
ipcMain.on('openNewWindow', function(event, arg) { const windowEEE = new BrowserWindow({ // 配置保持不变 }) windowEEE.loadFile(arg.html, {query: arg.query}) // 返回同步响应,释放IPC阻塞 event.returnValue = { success: true } });
额外优化:避免内存泄漏
主进程中windowEEE是全局变量,每次创建会覆盖之前的窗口引用,可能导致内存泄漏。建议用数组保存所有子窗口引用,窗口关闭时移除:
const childWindows = []; ipcMain.on('openNewWindow', function(event, arg) { const windowEEE = new BrowserWindow({ // 配置保持不变 }) childWindows.push(windowEEE); // 窗口关闭时清理引用 windowEEE.on('closed', () => { const idx = childWindows.indexOf(windowEEE); if (idx !== -1) childWindows.splice(idx, 1); }) windowEEE.loadFile(arg.html, {query: arg.query}) });
内容的提问来源于stack exchange,提问作者Agustin Fernandez
相关产品推荐
相关产品推荐

