Electron进程间通信

摘要:
每个BrowserWindow实例在其呈现过程中运行一个网页。当BrowserWindow实例被破坏时,相应的渲染过程也将终止。渲染进程通过IPC与主进程通信,以在网页上执行GUI操作。为了安全和可能的资源泄漏,直接从渲染器进程调用与本地GUI相关的API是有限的。在渲染过程中,ipcRender模块用于向主进程发送消息。在主进程中,ipcMain接收消息并执行操作。如果需要反馈,则通知渲染过程,并且渲染过程根据接收到的内容执行相应的操作。

在说Electron进程通信的时候,先说一下Electron中的两种进程:主进程和渲染进程。

主进程通过创建 BrowserWindow 实例来创建网页。 每一个 BrowserWindow 实例在其渲染过程中运行网页,当一个BrowserWindow 实例被销毁时,对应的渲染过程也会被终止。简单来说,一个客户端就是一个主进程。

渲染进程只能管理相应的网页,一个渲染进程的崩溃不会影响其他渲染进程。渲染进程通过 IPC 与主进程通信在网在页上执行 GUI 操作。 出于安全和可能的资源泄漏考虑,直接从渲染器进程中调用与本地 GUI 有关的 API 受到限制。简单来说,一个页面就是一个渲染进程。

注意:主进程管理所有网页及其对应的渲染进程。

1. 使用IPC模块进行通信

ipcMain 模块和 ipcRenderer 是类 EventEmitter 的实例。在渲染进程中使用ipcRender模块向主进程发送消息,主进程中ipcMain接收消息,进行操作,如果还需要反馈,则通知渲染进程,渲染进程根据接收的内容执行相应的操作。

ipcMain相关文档:https://www.electronjs.org/docs/api/ipc-main

ipcRenderer相关文档:https://www.electronjs.org/docs/api/ipc-renderer

1.1 异步消息

主进程将异步消息发送回发件人,需要使用event.sender.send()

// 渲染进程中
const {ipcRenderer} = require('electron')
ipcRenderer.send('asynchronous-message', 'ping') //给Main进程发送消息 'ping'
ipcRender.on('asynchronous-reply', function (event, arg) { // 接收到Main进程返回的消息
  const message = `异步消息回复: ${arg}`
})

// 主进程中
const {ipcMain} = require('electron')
ipcMain.on('asynchronous-message',(event, arg) => { // arg为接受到的消息
  event.sender.send('asynchronous-reply', 'pong'); // 返回一个 'pong'
})

1.2 同步消息

此方法的同步特性意味着它在完成任务时会阻止其他操作,主进程回复同步信息时,需要设置event.returnValue

// 渲染进程中
const {ipcRenderer} = require('electron')

ipcRenderer.sendSync('synchronous-message', 'ping') //给Main进程发送消息 'ping'

ipcRender.on('synchronous-reply', function (event, arg) { // 接收到Main进程返回的消息
  const message = `同步消息回复: ${arg}`
})

// 主进程中
const {ipcMain} = require('electron')

ipcMain.on('synchronous-message',(event, arg) => { // arg为接受到的消息
  event.returnValue = 'pong' // 返回一个 'pong'
})

注意:切忌用 ipc 传递大量的数据,会有很大的性能问题,严重会让你整个应用卡住。

2. webContents.send方法实现通信

webcontents相关文档:https://www.electronjs.org/docs/api/web-contents

webContents.send是BrowserWindow类的一个方法。

// 主进程中
mainWindow.webContents.send('list', res.data); // mainWindow是一个BrowserWindow实例

// 渲染进程中
const {ipcRenderer} = require('electron')

ipcRenderer.on('list', (e, msg) => {
  console.log(msg);
});

3. 渲染进程之间的通信

如果数据不需要实时性,只是渲染进程之间数据的共享,可以使用localStoragesessionStorageIndexedDB,如果需要实时共享,可以利用主进程做消息中转或者利用 remote 接口直接获取渲染进程发送消息。

3.1 利用主进程把渲染进程1的消息发送给渲染进程2中

// 主进程中监听ping-event
ipcMain.on('ping-event', (event, arg) => {
  mainWindow.webContents.send('pong-event', 'something'); // mainWindow是一个BrowserWindow实例
  // 或者
  event.sender.send('pong-event', 'something');
}

// 渲染进程1
const {ipcRenderer} = require('electron')

ipcRenderer.send('ping-event', (event, arg) => {
    // do something
  }
)

// 渲染进程2
const {ipcRenderer} = require('electron')

ipcRenderer.on('pong-event', (event, arg) => {
    // do something
  }
)

3.2 使用remote或者ipcRenderer.sendTo

// 主进程
// 两个窗口互相获取对方的窗口 id, 并发送给渲染进程
win1.webContents.send('distributeIds',{
  win2Id : win2.id
});
win2.webContents.send('distributeIds',{
  win1Id : win1.id
});

// 渲染进程
// 渲染进程1通过 id 发送给渲染进程2
const {ipcRenderer} = require('electron')

remote.BrowserWindow.fromId(win2Id).webContents.send('someMsg', 'someThing');
// 或者
ipcRenderer.sendTo(win2Id, 'someMsg', 'someThing')
标签: Electron
文章转载自:https://wangdaodao.com/20210401/electron-process.html

免责声明:文章转载自《Electron进程间通信》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇前端 ArrayBuffer 与 Blob 互转4、MySQL 申明变量给查询数据编号下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Win32多线程编程(1) — 基础概念篇

  内核对象的基本概念 Windows系统是非开源的,它提供给我们的接口是用户模式的,即User-Mode API。当我们调用某个API时,需要从用户模式切换到内核模式的I/O System Services API。例如我们调用Kernel32.dll中的CreateFile创建文件,最终将执行ntdll.dll中的系统服务NtCreateFile...

智能打印SDK-源码剖析

 演示站点+源码 均在github  迁徙至github: https://github.com/micro-chen/WebPrinter  智能打印SDK-官方群 547747202 -----------------过时--------------- 开源地址:http://www.dnnode.com/ 软件下载地址:http://www.dnno...

一、OpenTCS4.12 创建一个新的通信驱动

很多人研究这个平台,都会卡在第一步,如何创建一个新的通信驱动, 官方文档也没怎么写清楚 今天写这个博客,是为了帮助大家创建一个新的驱动(具体的通信,我这儿就不讲解) 一、首先在官网下载4.12的源码http://www.opentcs.org/en/download.html 二、安装IDE 我这儿使用的是NetBeans8.2(不会装的就别学JAVA了)...

使用SerialPort类设计串口通讯程序 (VS2005)[转载]

一.概述 在Visual Studio 6.0中编写串口通讯程序,一般都使用Microsoft Communication Control(简称MSComm)的通讯控件,只要通 过对此控件的属性和事件进行相应编程操作,就可以轻松地实现串口通讯。但在Microsoft.Net技术广泛应用的今天,Visual Studio.Net没有将此控件加入控件库,所以人...

前端视频播放组件 vue-video-player

1 安装 2 cnpm install vue-video-player -S 3 cnpm install 'video.js' -S 4 5 在main.js中导入 6 import VueVideoPlayer from 'vue-video-player'; 7 import 'video.js/dist/video-js.css'; 8 Vue...

VC 串口通讯基本原理,讲的很是详细

目 录打开串口........................................................................................................................ 2关闭串口.................................................