Electron主进程如何实时接收渲染进程的频繁数据更新?

爱学习的一茹 阅读 94

我在做一个实时监控工具,渲染进程每秒发送传感器数据到主进程,但发现主进程只能收到第一次的数据。我用的是ipcRenderer.send和ipcMain.on的组合,但后续更新没有触发回调。

这是渲染进程的代码片段:


<button onclick="sendData()">更新数据</button>
<script>
const { ipcRenderer } = require('electron');
let count = 0;
function sendData() {
  count++;
  ipcRenderer.send('sensor-data', { value: count });
  console.log('已发送:', count); // 控制台显示正常递增
}
</script>

主进程这边用了事件监听,但只收到初始值1,之后再没变化:


ipcMain.on('sensor-data', (event, data) => {
  console.log('主进程收到:', data.value); // 只输出1次
  // 尝试过把监听写在createWindow之后,但没用
});

是不是需要设置某种长连接或心跳机制?或者主进程监听被覆盖了?

我来解答 赞 11 收藏
二维码
手机扫码查看
2 条解答
艺童的笔记
你的监听函数只执行了一次,说明可能在某个地方把它覆盖掉了或者绑定了只执行一次的方法。最简单的办法:确认 ipcMain.on 是稳定绑定的,没有被重复赋值。

主进程改成这样:
const { ipcMain } = require('electron');

ipcMain.on('sensor-data', (event, data) => {
console.log('主进程收到:', data.value);
});


渲染进程每秒自动发送数据可以加个定时器:
setInterval(() => {
count++;
ipcRenderer.send('sensor-data', { value: count });
}, 1000);
点赞 4
2026-02-06 12:08
柯言 Dev
问题出在ipcMain监听器的实现上。Electron的ipcMain.on方法是单次监听,触发后会自动解除绑定。要实现实时数据接收需要改用ipcMain.on的持续监听模式。

主进程代码应该这样写:
const { ipcMain } = require('electron');

ipcMain.on('sensor-data', (event, data) => {
console.log('主进程收到:', data.value);
});

// 保持引用防止被GC回收
global.sensorListener = () => {};

// 或者使用once方法手动重新绑定
ipcMain.on('sensor-data', (event, data) => {
console.log('实时数据:', data.value);

// 处理完数据后重新注册监听
ipcMain.emit('sensor-data', event, data);
});


具体原理是这样的:
Electron的IPC通信基于Chrome IPC系统,每个监听器默认都是单次有效的
当使用ipcMain.on时,监听器在触发后会被自动移除
我们需要显式地保持监听器活跃状态,或者改用once方法手动控制生命周期
最简单的解决方案是直接使用持续监听模式,不要在回调里做阻塞操作

另外要注意:
频繁发送的数据需要考虑背压问题
每秒超过10次的频率建议使用ipcRenderer.invoke进行应答确认
可以添加错误处理逻辑避免进程崩溃
主进程处理耗时操作会影响渲染进程,建议使用worker线程

测试的时候可以在主进程监听里加个时间戳:
console.log(收到数据 ${Date.now()} -, data.value);

这样能更直观看到数据是否真的在持续接收
点赞 5
2026-02-05 08:00