2016-09-21 35 views
0

当从托盘实例中单击菜单项时,我正在启动一个新的BrowserWindow。每当窗口关闭时,它也会退出包括托盘实例在内的整个应用程序。为了克服我使用下面的代码:BrowserWindow中的内存泄漏,Electron

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实例不会从内存丢弃/释放。

Memory Leak

每次被点击菜单它会打开一个新的窗口,但在关闭它,它不会从内存中释放和过程只是栈到内存中。

如何在不终止Tray实例的情况下从内存中释放BrowserWindow实例?

回答

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() 
    } 
}) 
+0

嗨Vadim,我不想退出应用程序我只想从内存中清除BrowerWindow实例。现在我正在使用'e.preventDefault(); win.hide();”当窗户关闭时,我想因为我隐藏窗户,所以窗户停留在内存中。当我使用'win.close()'时,它也会退出应用程序。所以我的问题如何关闭窗口,而不必退出应用程序,并从内存中丢弃窗口实例。 –

+0

@VaibhavSidapara我的观点是你需要处理['window-all-closed'](http://electron.atom.io/docs/api/app/#event-window-all-closed)事件。 –

+0

谢谢你的建议,但我的应用程序只是一个托盘应用程序,如果我把这个逻辑它也会退出托盘应用程序?窗户只是一个关于我们的页面而已。整个应用程序作为托盘应用程序运行。 –

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(); 
    } 
} 

然而,随着瓦迪姆Macagon指出,它看起来像是在应用程序中定义了一个'window-all-closed'事件,当所有窗口都关闭时,它会被告知退出。搜索“window-all-closed”的所有文件,并删除app.quit()调用。如果你这样做,你应该能够保持原样。