当从Tray实例单击菜单项时,我启动了一个新的BrowserWindow。每当窗口关闭时,它也会退出整个应用程序,包括托盘实例。为了克服这一点,我使用下面的代码:
click: function ()
{
var win = new BrowserWindow({
width: 400,
height: 600,
resizable: false,
fullscreen: false,
title: 'About',
icon : __dirname+'/assets/logo/windowIcon.png'
})
win.setMenu(null)
win.loadURL(`file://${__dirname}/about.html`)
// win.webContents.openDevTools()
win.on('close', function (e)
{
e.preventDefault()
win.hide()
win.removeAllListeners('close')
})
}
但后来我发现即使在窗口关闭后,BrowserWindow实例也不会从内存中丢弃/释放。
每次单击该菜单时,它都会打开一个新窗口,但在关闭它时,它不会从内存中释放出来,而且进程只会叠加到内存中。
如何在不终止Tray实例的情况下从内存中释放BrowserWindow实例?
答案 0 :(得分:0)
当所有窗户关闭时,您的主要流程是做什么的?以下是电子快速启动的功能:
// 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()
}
})
答案 1 :(得分:0)
通过在事件上调用preventDefault(),可以防止窗口在主进程中被销毁,因此它会被泄露。
您可以定义对窗口的模块级引用,而不是在每次单击时创建一个新窗口,而只在第一次单击菜单项时创建它:
// Module scope
let win = null;
// ... your menu code
click: function () {
if(win === null) {
win = new BrowserWindow({
width: 400,
height: 600,
resizable: false,
fullscreen: false,
title: 'About',
icon : __dirname+'/assets/logo/windowIcon.png'
});
win.setMenu(null);
win.loadURL(`file://${__dirname}/about.html`);
win.on('close', function (e) {
e.preventDefault();
win.hide();
});
} else {
win.show();
}
}
然而,正如Vadim Macagon指出的那样,看起来你在应用程序中定义了一个“全窗口关闭”事件,当所有窗口关闭时,它会被告知退出。在'window-all-closed'上搜索所有文件并删除app.quit()调用。如果你这样做,你应该能够按原样保留你的代码。