2016-09-21 68 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()調用。如果你這樣做,你應該能夠保持原樣。