You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Electron渲染进程如何调用主进程的threads.js多线程方法?

解决方案:在Electron渲染进程调用主进程的sendFile方法

你可以通过两种常用方式实现渲染进程对主进程方法的调用,以下是具体步骤:

方案一:使用Electron IPC通信(推荐,符合安全最佳实践)

1. 主进程(main.js)配置IPC监听

在主进程中引入ipcMain,注册一个IPC处理函数,将sendFile的调用逻辑封装并暴露给渲染进程:

const { app, BrowserWindow, ipcMain } = require('electron');
const { spawn, Worker, Thread } = require('threads');

// 保留你的sendFile方法
async function sendFile(text) {
    const send = await spawn(new Worker('./src/service/sender.js'));
    const result = await send(text);
    console.log(result);
    await Thread.terminate(send);
    return result;
}

// 监听渲染进程的调用请求
ipcMain.handle('call-send-file', async (event, text) => {
    return await sendFile(text);
});

// 窗口创建逻辑(如果没有则补充)
function createWindow() {
    const mainWindow = new BrowserWindow({
        width: 800,
        height: 600,
        webPreferences: {
            contextIsolation: true, // 保持开启,提升安全性
            preload: './preload.js' // 配置预加载脚本
        }
    });
    mainWindow.loadFile('index.html');
}

app.whenReady().then(createWindow);

2. 添加预加载脚本(preload.js)

通过预加载脚本安全地向渲染进程暴露IPC调用能力:

const { contextBridge, ipcRenderer } = require('electron');

contextBridge.exposeInMainWorld('electronAPI', {
    callSendFile: (text) => ipcRenderer.invoke('call-send-file', text)
});

3. 渲染进程中调用

在渲染进程的JS文件或HTML脚本中,通过暴露的API调用:

async function invokeSendFile() {
    try {
        const result = await window.electronAPI.callSendFile('测试文本');
        console.log('调用结果:', result);
        // 这里处理返回结果
    } catch (err) {
        console.error('调用失败:', err);
    }
}

// 示例触发调用
invokeSendFile();

方案二:使用@electron/remote模块(适合快速调试)

1. 主进程(main.js)配置remote模块

先初始化并启用remote,同时将sendFile挂载到全局对象:

const { app, BrowserWindow } = require('electron');
const remoteMain = require('@electron/remote/main');
const { spawn, Worker, Thread } = require('threads');

// 初始化remote
remoteMain.initialize();

// 保留sendFile方法并挂载到全局
global.sendFile = async function(text) {
    const send = await spawn(new Worker('./src/service/sender.js'));
    const result = await send(text);
    console.log(result);
    await Thread.terminate(send);
    return result;
};

function createWindow() {
    const mainWindow = new BrowserWindow({
        width: 800,
        height: 600,
        webPreferences: {
            nodeIntegration: true,
            contextIsolation: false,
            enableRemoteModule: true
        }
    });
    // 启用当前窗口的remote能力
    remoteMain.enable(mainWindow.webContents);
    mainWindow.loadFile('index.html');
}

app.whenReady().then(createWindow);

2. 渲染进程中调用

直接通过remote获取全局方法并调用:

const { remote } = require('electron');

async function callSendFile() {
    try {
        const result = await remote.getGlobal('sendFile')('测试文本');
        console.log('调用结果:', result);
    } catch (err) {
        console.error('调用失败:', err);
    }
}

// 示例触发调用
callSendFile();

内容的提问来源于stack exchange,提问作者Алексей

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 23:35:16