Electron主进程如何实时接收渲染进程的频繁数据更新?
我在做一个实时监控工具,渲染进程每秒发送传感器数据到主进程,但发现主进程只能收到第一次的数据。我用的是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之后,但没用
});
是不是需要设置某种长连接或心跳机制?或者主进程监听被覆盖了?
主进程改成这样:
渲染进程每秒自动发送数据可以加个定时器:
主进程代码应该这样写:
具体原理是这样的:
Electron的IPC通信基于Chrome IPC系统,每个监听器默认都是单次有效的
当使用ipcMain.on时,监听器在触发后会被自动移除
我们需要显式地保持监听器活跃状态,或者改用once方法手动控制生命周期
最简单的解决方案是直接使用持续监听模式,不要在回调里做阻塞操作
另外要注意:
频繁发送的数据需要考虑背压问题
每秒超过10次的频率建议使用ipcRenderer.invoke进行应答确认
可以添加错误处理逻辑避免进程崩溃
主进程处理耗时操作会影响渲染进程,建议使用worker线程
测试的时候可以在主进程监听里加个时间戳:
console.log(
收到数据 ${Date.now()} -, data.value);这样能更直观看到数据是否真的在持续接收