gpt4 book ai didi

node.js - Electron 应用程序中的事件发射器内存泄漏

转载 作者:行者123 更新时间:2023-12-03 12:40:05 28 4
gpt4 key购买 nike

我正在开发React Electron应用程序,但我的应用程序的多个区域都遇到了事件发射器内存泄漏的困扰。我对Node.js的经验不是很丰富,所以请原谅我的业余错误。

(node:3142) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 file:minified listeners added to [EventEmitter]. Use emitter.setMaxListeners() to increase limit
让我注意,这在我的应用程序的长期运行中确实给我带来了问题,因此这不是我可以简单地通过 setMaxListeners()“解决”或保持沉默的问题。
基本上,用户会丢弃一些文件,然后链开始。我创建了一个事件流程,该流程将水滴最小文件添加到渲染器流程的列表中:
  • 对于删除的每个文件,将文件发送到主进程进行修改。
    App.js(渲染过程):
  • document.ondrop = (e) => {
    e.preventDefault();
    e.stopPropagation();
    handleFiles(e.dataTransfer.files);
    };

    const sendFiles = (files) => {
    for (let file of files) {
    file = file.path || file;

    // if file is a folder, recursively check each file in the nested folders
    if (fs.lstatSync(file).isDirectory()) {
    // rename for clarity
    let folder = file;
    let files = fs.readdirSync(folder).map((fileName) => {
    return path.join(folder, fileName);
    });
    sendFiles(files);
    } else {
    // don't add duplicate files to list
    if (list.some((item) => item.oPath === file.path)) {
    return false;
    }
    ipcRenderer.send("file:add", file);
    }
    }
    };
  • 缩小每个文件的大小,并将缩小的路径发送回渲染器进程进行显示。
    main.js(主进程):
  • ipcMain.on("file:add", (e, path) => {
    minifyFile(path, mainWindow);
    });

    const minifyFile = (filePath, mainWindow) => {
    ...
    mainWindow.webContents.send(
    "file:minified",
    {
    path: saveLocation,
    name: name,
    type: extension,
    oSize: originalSize,
    nSize: newSize,
    oPath: filePath,
    newName: newName,
    }
    );
    ...
    }
  • 现在我们有了要显示的每个缩小文件的文件信息,将其添加到React中的列表状态。
    App.js(再次渲染过程):
  • ipcRenderer.on("file:minified", (e, data) => {
    // if item's path already exists on list, don't add it
    if (list.some((item) => item.path === data.path)) {
    return false;
    } else {
    let newList = list;
    newList.push({
    name: data.name,
    path: data.path,
    type: data.type,
    oSize: data.oSize,
    nSize: data.nSize,
    oPath: data.oPath,
    newName: data.newName,
    });

    setList(newList);
    console.log(list);
    }
    });
    发生这种情况时,将按预期添加文件,但是随着我在程序的整个生命周期中继续删除更多文件,要求“file:minified”的事件发射器以 的速度增长,这开始对我造成其他问题程序的一部分,因为现在它尝试将项目添加到列表中的次数接近数百次。
    如果有人可以帮助我找到我所犯的错误,我将不胜感激,因为我对Node.js中的这些问题视而不见。
    我需要为此删除事件监听器吗?正如我所说,我对此不太确定。
    我的应用程序的渲染过程中也遇到了另一个内存泄漏问题,任何人有兴趣检查它是否可以链接;我真的一点儿都不知道。 Here's my other thread.

    最佳答案

    看来您从每次发送的主要流程中都收到了一个响应。如果是这种情况,您可以使用ipcRenderer.invoke()ipcMain.handle()之类的...
    App.js

    document.ondrop = (e) => {
    e.preventDefault();
    e.stopPropagation();
    handleFiles(e.dataTransfer.files);
    };

    const sendFiles = (files) => {
    for (let file of files) {
    file = file.path || file;

    // if file is a folder, recursively check each file in the nested folders
    if (fs.lstatSync(file).isDirectory()) {
    // rename for clarity
    let folder = file;
    let files = fs.readdirSync(folder).map((fileName) => {
    return path.join(folder, fileName);
    });
    sendFiles(files);
    } else {
    // don't add duplicate files to list
    if (list.some((item) => item.oPath === file.path)) {
    return false;
    }
    ipcRenderer.invoke("file:add", file)
    .then((data) => handleMinified(data)})
    }
    }
    };

    const handleMinified = (data) => {
    // if item's path already exists on list, don't add it
    if (list.some((item) => item.path === data.path)) {
    return false;
    }
    else {
    let newList = list;
    newList.push({
    name: data.name,
    path: data.path,
    type: data.type,
    oSize: data.oSize,
    nSize: data.nSize,
    oPath: data.oPath,
    newName: data.newName,
    });

    setList(newList);
    console.log(list);
    }

    };

    main.js
    ipcMain.handle("file:add", (e, path) => {
    const data = await minifyFile(path);
    return data;
    });


    const minifyFile = (filePath, mainWindow) => {
    ...
    return {
    path: saveLocation,
    name: name,
    type: extension,
    oSize: originalSize,
    nSize: newSize,
    oPath: filePath,
    newName: newName,
    }
    }
    这样,事件监听器将为您删除:)
    https://www.electronjs.org/docs/api/ipc-renderer#ipcrendererinvokechannel-args

    关于node.js - Electron 应用程序中的事件发射器内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62547726/

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