gpt4 book ai didi

node.js - 在关闭所有打开的渲染器进程的app.quit中, Electron 事件发射器错误

转载 作者:行者123 更新时间:2023-12-03 12:35:07 26 4
gpt4 key购买 nike

我有一个主窗口,其中列出了所有可用的服务器以及带有服务器ID的状态按钮。按下相关状态按钮后,将打开一个信息窗口-将ID传递给信息窗口的副本,从而使状态按钮处于禁用状态。如果关闭了信息窗口,则信息窗口会将ID传递回主窗口,从而使状态按钮再次启用。为此,我使用main.js作为代理,监听渲染器进程并在主窗口和信息窗口之间交换信息。

我想做的是列出服务器。如果它们在线,则一次从不同渲染器进程(信息窗口的实例)上的多个服务器获取一些信息。

问题是如果主窗口关闭,我希望所有信息窗口都关闭。

// App ready
app.on('ready', ()=>{
mainWindow = new BrowserWindow({x : 0, y : 0 , width : 500, height: 600});

mainWindow.loadURL(url.format({
pathname : path.join(__dirname, 'windows', 'mainWindow.html'),
protocol : 'file',
slashes : true
}));

// Close the app if main window closed
mainWindow.on('close', (e) => {
let openedOnes = BrowserWindow.getAllWindows();
openedOnes.forEach(wind => {
if(wind.hasOwnProperty('custom')){
wind.close();
};
});

app.quit();
});
});

在创建信息窗口时,我向 BrowserWindow对象添加了一个自定义字段:
BrowserWindow {
_events:
{ blur: [Function],
focus: [Function],
show: [Function: visibilityChanged],
hide: [Function: visibilityChanged],
minimize: [Function: visibilityChanged],
maximize: [Function: visibilityChanged],
restore: [Function: visibilityChanged],
close: [Function: callIntoRenderer] },
_eventsCount: 8,
devToolsWebContents: [Getter],
custom: { server_id: '3' } }

因此,借助自定义字段,我可以获得所有打开的服务器信息实例。

但是,当我单击关闭时,以下部分在 main.js处失败;
ipcMain.on('window_closed', (e, item)=>{
mainWindow.webContents.send('button_enable', item);
});

它引发以下错误。

enter image description here
main.js:53ipcMain.on('window_closed'...行。顺便说一句,如果我省略这条线,一切都会很好。

最佳答案

看来发生了什么事,您的mainWindow close处理程序被触发,告诉其他窗口关闭,然后触发了window_closed事件(我想这是您添加的自定义事件?),当mainWindow.webContents.send被调用时,mainWindow' s关闭处理程序完成,窗口关闭。

像这样发送消息之前,只需添加isDestroyed检查:

ipcMain.on('window_closed', (e, item)=>{
if (mainWindow && !mainWindow.isDestroyed())
mainWindow.webContents.send('button_enable', item);
});

您的其他选择(尽管可以说不是最佳选择)是:
  • 在主窗口关闭时设置一个标志,如果看到该标志,让window_closed处理程序返回(如果我们要关闭所有内容,肯定没有理由发送button_enable消息):

  • let mainWindowIsClosing = false;
    mainWindow.on('close', (e)=>{
    mainWindowIsClosing = true;
    ...
    wind.close();
    ...
    });

    ipcMain.on('window_closed', (e, item)=>{
    if (mainWindowIsClosing) return;
    mainWindow.webContents.send('button_enable', item);
    });
  • 您可以调用destroy方法而不是close来避免为子窗口触发close事件。 (尽管window_closed不是我认为的 Electron 事件,所以这取决于您如何 Hook 所有内容):

  • mainWindow.on('close', (e)=>{
    ...
    wind.destroy();
    });

    关于node.js - 在关闭所有打开的渲染器进程的app.quit中, Electron 事件发射器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53360169/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com