2016-09-21 5 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-allclosed)イベントを処理する必要があるということでした。 –

+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()呼び出しを削除します。そうするなら、コードをそのまま残すことができます。

関連する問題