2016-09-21 3 views
0

Tray 인스턴스에서 메뉴 항목을 클릭하면 새 BrowserWindow가 시작됩니다. 창을 닫을 때마다 Tray 인스턴스를 포함하여 전체 앱도 종료됩니다.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() 호출을 제거하십시오. 그렇게하면 코드를 그대로 둘 수 있습니다.

관련 문제