iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >Electron进程间通信的实现
  • 419
分享到

Electron进程间通信的实现

2024-04-02 19:04:59 419人浏览 薄情痞子
摘要

目录主进程与渲染进程之间通信ipc模块 + window.WEBContentsremote模块渲染进程之间通信使用Electron开发出来的桌面应用都是多进程的,其中包含了一个主进

使用Electron开发出来的桌面应用都是多进程的,其中包含了一个主进程(Main)和至少一个渲染进程(Renderer)。

主进程控制整个应用的生命周期,通过electron中的一些模块与GUI交互,同时控制每一个渲染进程。

渲染进程会在BrowserWindow对象创建出的窗口中渲染出Web页面,每个渲染页面都运行在独立的进程中。

主进程与渲染进程之间通信

ipc模块 + window.webContents

ipc模块包含ipcMain和 ipcRenderer两个模块,其中ipcMain在主进程中使用,ipcRenderer在渲染进程中使用,在使用之前,要使用require引入对应的模块。

ipc模块中的方法:

  • ipcMain.on(msg, () => {}):监听渲染进程发送的msg消息,并做出响应。
  • ipcMain.once(msg, () => {}):监听渲染进程发送的msg消息,并做出响应,但是监听到一次msg事件后自动移除这个监听器。
  • ipcRenderer.on(msg, () => {}):监听主进程发送的msg消息,并做出响应。
  • ipcRenderer.once(msg, () => {}):监听主进程发送的msg消息,并做出响应,但是监听到一次msg事件后自动移除这个监听器。
  • ipcRenderer.send(msg, data):监听渲染进程向主进程发送msg异步消息,并携带参数data。
  • ipcRenderer.sendSync(msg, data):监听渲染进程向主进程发送msg同步消息,并携带参数
  • ipcRenderer.sentTo(webContentId, msg, data):监听渲染进程向具有webContentId的窗口发送消息
  • ipcRenderer.sendToHost(msg, data):监听渲染进程向host页面上的 <webview> 元素发送消息

ipc模块还提供了删除指定监听器和删除所有监听器的方法:removeListener()、removeAllListener(),这两个方法在ipcMain和ipcRenderer这两个模块中的用法是一样的。

通过上面的几个监听器我们发现,单独使用ipc模块无法实现主进程主动向渲染进程发送消息。所以我一般把BrowserWindow实例中的webContents和ipc模块结合使用

一个主进程与渲染进程间通信的例子

// 在主进程中使用ipcMain
const { ipcMain, BrowserWindow } = require('electron');

window = new BrowserWindow({
    width: 800,
    height: 600
});

// 主进程主动向渲染进程发送消息
window.webContents.send('main webContents msg', data);

// 主进程接收渲染进程发送的消息,并通过回调函数做出响应
ipcMain.on('renderer ipc msg', (event, arg) => {
    // TODO something
})
// 在渲染进程中使用ipcRender
const ipcRender = require('electron');

// 渲染进程中使用ipcRenderer.on接收主进程消息,并通过回调函数做出相应
ipcRenderer.on('main webContents msg', (event, arg) => {
    // 在相应主进程事件时,通过ipcRenderer.send方法像主进程发送另一条消息
    ipcRenderer.send('renderer ipc msg', data);
})

ipcRenderer发送的同步消息和异步消息

在上面列举的几个方法中,其中ipcRenderer发送消息的方法分为发送同步消息的方法ipcRenderer.send和发送异步消息的方法ipcRenderer.sendSync。主程序在监听到这两种不同方法的消息时,可以通过不同的方式给渲染进程返回消息:

// 渲染进程

// 渲染进程发送异步消息
ipcRenderer.send('msg', data);

// 渲染进程发送同步消息。 发送同步消息,任务未完成时会阻止其他操作
var message = ipcRenderer.sendSync('sync msg', data);
ipcMain.on('msg', (event, arg) => {
    // 主进程监听到渲染进程发的异步消息后,通过event.sender.send()的方式进行响应,可以在渲染进程中使用ipcRenderer.on监听'return msg'消息
    event.sender.send('return msg', data)
})

ipcMain.on('sync msg', (event, arg) => {
    event.retuenValue = 'msg';
})

remote模块

在渲染进程中使用remote,可以调用主进程所提供的一些方法。(例如:dialog、menu等模块)

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

//通过remote模块,可以在渲染进程中调用BrowserWindow模块
let win = new BrowserWindow({ width: 800, height: 600});
win.loadURL('index.html');

渲染进程中使用remote模块返回的对象,都代表了主进程中的一个对象,一般称为远程对象。调用远程对象的方法时,实际上是在想主进程发送同步消息。

比如上面的代码中,BrowserWindow实例是通过remote模块返回的,所以渲染进程中的BrowserWindow和win都是远程对象。在执行new BrowserWindow({...})这段代码的时候,并没有在渲染进程中创建BrowserWindow实例的对象,而是在主进程中创建了BrowserWindow对象,并把这个对象返回到渲染进程中。

remote的方法和属性

  • remote.require(module):返回主进程中的对象
  • remote.getCurrentWindow():返回此网页所属的窗口
  • remote.getGlobal(name):返回主进程中name的全局变量
  • remote.process:返回主进程中的process对象

渲染进程之间通信

上面提到的通信方法,经过测试发现都无法在渲染进程之间直接通信,有时候我们开发中可以使用主进程作为中转进行渲染进程间的通信:

// renderer process A
const { ipcRenderer } = require('electron');
ipcRenderer.send('A send msg', data);
// main process
const { ipcMain, BrowserWindow } = require('electron');

let win = new BrowserWindow({...});

ipcMain.on('A send msg', (event ,arg) => {
    // TODO something
    win.webContents.send('main send msg', data);
})
const { ipcRenderer } = require('electron');
ipcRenderer.on('main send msg', (event, arg) => {
    // TODO something
})

除了上面这种需要main process中转的方式之外,还有一种方式能够实现渲染进程之间的直接通信:

// main process
// 两个窗口互相获取对方的窗口 id, 并发送给渲染进程
const { BrowserWindow} = require('electron');

let win1 = new BrowserWindow({...});
let win2 = new BrowserWindow({...});

win1.webContents.send('distributeIds',{
    win2Id : win2.id
});
win2.webContents.send('distributeIds',{
    win1Id : win1.id
});
// renderer process
const { remote } = require('electron').remote;

// fromId() 可以根据窗口id找到目标窗口
remote.BrowserWindow.fromId(win2Id).webContents.send('msg', data);

到此这篇关于Electron进程间通信的实现的文章就介绍到这了,更多相关Electron进程间通信内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Electron进程间通信的实现

本文链接: https://www.lsjlt.com/news/149575.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Electron进程间通信的实现
    目录主进程与渲染进程之间通信ipc模块 + window.webContentsremote模块渲染进程之间通信使用Electron开发出来的桌面应用都是多进程的,其中包含了一个主进...
    99+
    2022-11-13
  • Electron进程间通信如何实现
    今天小编给大家分享一下Electron进程间通信如何实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。使用Electron开...
    99+
    2023-06-30
  • vue与electron实现进程间的通信详情
    目录一、配置内容1.进程间的通信第一种方式引入ipcRenderer第二种方式引入ipcRenderer2.渲染进程常用配置3.将ipcMain封装到一个js中统一处理三、总结前言:...
    99+
    2022-11-13
  • Node.js和Electron是怎么做进程通信的
    这篇文章主要讲解了“Node.js和Electron是怎么做进程通信的”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Node.js和Electron是怎么做...
    99+
    2022-10-19
  • Electron+React进行通信的方法
    目录1.前言:2.一些理解:3.数据交互4.前后端交互5.一些代码举例:1.前言: Electron是使用 JavaScript,HTML 和 CSS 构建跨平台的桌面应用程序 项目...
    99+
    2022-11-13
  • python多进程实现进程间通信实例
    python中的多线程其实并不是真正的多线程,如果想要充分地使用多核CPU的资源,在python中大部分情况需要使用多进程。Python提供了非常好用的多进程包multiprocessing,只需要定义一个...
    99+
    2022-06-04
    进程 实例 通信
  • golang进程间通信怎么实现
    在Go语言中,有多种方式可以实现进程间通信。以下是一些常见的方法: 使用管道(Pipe):管道是进程间通信的一种简单而有效的方式...
    99+
    2023-10-25
    golang
  • Linux进程间通信怎么实现
    这篇文章主要讲解了“Linux进程间通信怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Linux进程间通信怎么实现”吧!共享内存共享内存可以说是最有用的进程间通信方式,也是最快的IP...
    99+
    2023-07-05
  • 进程间的通信
      使用 multiprocessing 里的 Queue() import multiprocessing def download_from_web(q): """下载数据""" # 模拟从网上下载的数据 ...
    99+
    2023-01-30
    进程 通信
  • Node中的进程间通信怎么实现
    这篇“Node中的进程间通信怎么实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Node...
    99+
    2022-10-19
  • Android AIDL实现进程间通信探索
    前言:       前面总结了程序间共享数据,可以使用ContentProvider也可以使用SharedPreferenc...
    99+
    2022-06-06
    进程 aidl 进程间通信 通信 Android
  • Android Messenger实现进程间双向通信
    简介 Messenger是安卓进程间通信 (IPC) 最为简单的方式,可以实现进程间双向通信。详见官网介绍 代码实现 服务端应用实现 MessengerService接收客户端发送的...
    99+
    2022-11-12
  • Android中怎么实现进程间通信
    这篇文章给大家介绍Android中怎么实现进程间通信,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。由于android系统中应用程序之间不能共享内存。因此,在不同应用程序之间交互数据(跨进程通讯)就稍微麻烦一些。进程间通...
    99+
    2023-06-04
  • vue+electron实现创建多窗口及窗口间的通信(实施方案)
    目录一、前言二、实施方案1.创建多窗口2.多窗口间的通信三、后记一、前言 对于一个桌面应用来说,有时候单独一个窗口用户使用起来会不太方便,比方说写日报或者查看文件等,若是在同一窗口内...
    99+
    2022-11-13
  • Python通过队列实现进程间通信详情
    目录一、前言二、队列简介三、多进程队列的使用四、使用队列在进程间通信一、前言 在多进程中,每个进程之间是什么关系呢?其实每个进程都有自己的地址空间、内存、数据栈以及其他记录其运行状态...
    99+
    2022-11-11
  • Python如何通过队列实现进程间通信
    本篇内容主要讲解“Python如何通过队列实现进程间通信”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python如何通过队列实现进程间通信”吧!一、前言在多进程中,每个进程之间是什么关系呢?其...
    99+
    2023-07-02
  • Linux-进程间通信
    进程间通信 进程间通信介绍进程间通信目的进程间通信发展进程间通信分类 管道匿名管道匿名管道特点匿名管道读写规则 命名管道创建一个命名管道命名管道的打开规则用命名管道实现server&client通信 system...
    99+
    2023-08-19
    linux 服务器 网络 c++ C语言
  • 【Linux】进程间通信
    目录 1. 进程间通信 1.1. 进程间通信的目的 1.2. 如何实现进程间通信 2. 管道通信 2.1. 匿名管道 2.1.1 创建匿名管道 2.1.2 . 深入理解匿名管道 2.2. 命名管道 2.2.1. 创建命名管道 3. sys...
    99+
    2023-10-26
    linux 运维 服务器 操作系统 进程间通信
  • python 进程间通信
    python multiprocessing multiprocessing 在2.6才开始使用 multiprocessing 是一个使用方法类似threading模块的进程模块。允许程序员做并行开发。并且可以在UNIX和Windo...
    99+
    2023-01-31
    进程 通信 python
  • Android 进程间通信实现原理分析
    Android Service是分为两种:  本地服务(Local Service): 同一个apk内被调用  远程服务(Remote Service):被另一个apk调用远程...
    99+
    2022-06-06
    进程 进程间通信 通信 Android
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作