electron+vue3全家桶+vite项目搭建【13.1】ipc通信的使用,主进程与渲染进程之间的交互

文章目录

    • 引入
    • IPC通信[主/渲染]进程对应
    • 渲染进程=>主进程
      • 代码测试
      • 测试效果
    • 主进程=>渲染进程
      • 代码测试
      • 测试效果
    • 双向通信
      • 代码测试
      • 测试效果

引入

electron项目常常由一个主进程和多个渲染进程构成,渲染进程之间是隔离的,而所有渲染进程都和主进程共享资源。

  • 所有的渲染进程都是由主进程创建的
  • 每个窗口都对应着一个渲染进程
  • 所有的渲染进程共享一个主进程

我们主进程与渲染进程交互,渲染进程与渲染进程交互【多窗口交互】,都需要借助ipc通信来实现
封装加载进度显示,新建窗口 演示主进程与渲染进程通信
demo项目地址
官方ipc进程通信讲解教程
electron官方文档ipc通信

IPC通信[主/渲染]进程对应

方向主进程【ipcMain】渲染进程【ipcRenderer】
渲染=>主 【同步/异步】ipcMain.on()ipcRender.send() / ipcRender.sendSync() 【同步取值】
渲染=>主 【异步】ipcMain.handle()ipcRender.invoke()
主=>渲染 【异步】BrowserWindow【实例】.webContents.send()ipcRender.on()

渲染进程=>主进程

请添加图片描述

代码测试

1.我们创建一个ipc测试文件,ipcDemo.ts

  • electron\main\ipcDemo.ts
  • 注意:按官方文档来看,sendSync和handle中的return,是属于双向通信,这里为了方便演示同步/异步,直接拿他们来做演示,其实实际使用看来,只要不返回值,完全也可以当做单向通信
import { ipcMain } from "electron";

export const initIpcDemo = () => {
  // 同步处理通信,并等待主进程返回值
  ipcMain.on("event-on-test", (e, data: string) => {
    setTimeout(() => {
      e.returnValue = "主进程同步响应:" + data;
    }, 2000);
  });

  // 异步处理通信,异步返回结果
  ipcMain.handle("event-handle-test", (e, data: string) => {
      return "主进程异步响应:" + data;
  });

  // 异步处理一次
  ipcMain.handleOnce("event-handleOnce-test", (e) => {
    console.log("异步通信处理一次!");
  });
};

2.接着我们在electron的入口文件中引入

  • electron\main\index.ts
import {initIpcDemo} from './ipcDemo'

// 初始化ipc通信Demo
initIpcDemo();

3.我们创建一个ipcDemo的.vue文件,测试渲染进程=>主进程的单向通信:

  • src\components\demo\ipcDemo.vue
<template>
  <div>
    <go-back></go-back>
    <ul>
      <li><el-button @click="eventOnTest">同步通信测试</el-button></li>
      <li><el-button @click="eventHandleTest">异步通信测试</el-button></li>
      <li><el-button @click="eventHandleOnceTest">异步通信一次</el-button></li>
    </ul>
  </div>
</template>

<script setup lang="ts">
import { ipcRenderer } from "electron";
import { onMounted, onUnmounted } from "vue";
// 同步通信测试
function eventOnTest() {
  const result = ipcRenderer.sendSync("event-on-test", "狼来了");
  console.log(result);
}

// 异步通信测试
function eventHandleTest() {
  ipcRenderer.invoke("event-handle-test", "小龙你好").then((res) => {
    console.log(res);
  });
}

// 异步通信一次
function eventHandleOnceTest() {
  ipcRenderer.invoke("event-handleOnce-test");
}
</script>

<style scoped lang="scss"></style>

4.补充对应的页面路由后,我们看一下测试结果

测试效果

请添加图片描述

主进程=>渲染进程

请添加图片描述

代码测试

1.我们在主窗口初始化完毕的地方补充代码逻辑,创建一个定时器每隔两秒向渲染进程发送消息

  • electron\main\index.ts
 let number = 1;
  setInterval(() => {
    if (win && win.webContents) {
      win.webContents.send("event-from-main", "计数" + number++);
    }
  }, 2000);

请添加图片描述

2.渲染进程补充监听:

+src\components\demo\ipcDemo.vue

<script setup lang="ts">
    onMounted(()=>{
      ipcRenderer.on("event-from-main",eventFromMain);
    });
    
    // 来自主进程的消息
    function eventFromMain(e:any,data:string){
      console.log("监听到消息",data)
    }

    onUnmounted(()=>{
      ipcRenderer.removeListener("event-from-main",eventFromMain);
    });
</script>

测试效果

请添加图片描述

双向通信

按官方文档来看,主进程handle并return,渲染进程用promise语法,或主进程on并e.returnValue,渲染进程用sendSync就是双向通信
在这里插入图片描述
这里我个人认为多窗口间的双向通信适合用下面的写法,上面的写法在渲染进程=>主进程中已经演示,故不赘述,这里主要演示下下面的使用
请添加图片描述

代码测试

1.主进程补充逻辑,在收到渲染进程的调用后,主动给渲染进程的窗口发送消息

  • electron\main\ipcDemo.ts
import { ipcMain } from "electron";

export const initIpcDemo = () => {
  // 双向通信处理
  ipcMain.handle("event-handle-togeter-test", (e, data: string) => {
    e.sender.send("event-handle-togeter-test", "主进程通知" + data);
  });
};

2.测试代码补充逻辑

  • src\components\demo\ipcDemo.vue
<template>
  <div>
    <ul>
      <li>
        <el-button @click="eventHandleTogeterTestClick">双向通信</el-button>
      </li>
    </ul>
  </div>
</template>

<script setup lang="ts">
import { ipcRenderer } from "electron";
import { onMounted, onUnmounted } from "vue";

onMounted(()=>{
  ipcRenderer.on("event-handle-togeter-test",eventHandleTogeterTest);
});

function eventHandleTogeterTestClick(){
  ipcRenderer.invoke("event-handle-togeter-test","奥利给");
}

// 双向通信测试
function eventHandleTogeterTest(e:any,data:string) {
  console.log("渲染进程监听到:",data);
}

onUnmounted(()=>{
  ipcRenderer.removeListener("event-handle-togeter-test",eventHandleTogeterTest);
});
</script>

<style scoped lang="scss"></style>

测试效果

  • 这里我们可以思考一下,假如我需要点击一个窗口的按钮,通知另一个窗口操作,就可以利用双向通信,将另一个窗口的id传递给主进程以及对应的消息,主进程通过窗口id找到对应窗口,然后主动通知窗口进行对应操作

请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/62939.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode 周赛上分之旅 # 37 多源 BFS 与连通性问题

⭐️ 本文已收录到 AndroidFamily&#xff0c;技术和职场问题&#xff0c;请关注公众号 [彭旭锐] 和 BaguTree Pro 知识星球提问。 学习数据结构与算法的关键在于掌握问题背后的算法思维框架&#xff0c;你的思考越抽象&#xff0c;它能覆盖的问题域就越广&#xff0c;理解难度…

.NET 应用程序 部署

**硬件支持型号 点击 查看 硬件支持 详情** DTU701 产品详情 DTU702 产品详情 DTU801 产品详情 DTU802 产品详情 DTU902 产品详情 G5501 产品详情 本文内容 在设备上部署 dotnet应用&#xff0c;与任何其他平台的部署相同&#xff0c;可以2种方式&#xff1a; 依赖于框…

海外媒体发稿:软文写作方法方式?一篇好的软文理应合理规划?

不同种类的软文会有不同的方式&#xff0c;下面小编就来来给大家分析一下&#xff1a; 方法一、要选定文章的突破点&#xff1a; 所说突破点就是这篇文章文章软文理应以什么样的视角、什么样的见解、什么样的语言设计理念、如何文章文章的标题来写。不同种类的传播效果&#…

恒运资本:史上最强暑期档!总票房突破147亿,前三都是国产片!

暑期档电影又爆了&#xff01; 就在刚刚曩昔的周末&#xff0c;在《封神第一部》《巨齿鲨2&#xff1a;深渊》《火热》等电影的大卖&#xff0c;以及《背注一掷》点映及预售的加持下&#xff0c;短短两天的大盘票房就到达10亿元。 其间&#xff0c;据猫眼专业版数据&#xff0…

HCIP VLAN--Hybrid接口

一、VLAN的特点 1、一个VLAN就是一个广播域&#xff0c;所以在同一个VLAN内部&#xff0c;计算机可以直接进行二层通信&#xff1b;而不同VLAN内的计算机&#xff0c;无法直接进行二层通信&#xff0c;只能进行三层通信来传递信息&#xff0c;即广播报文被限制在一个VLAN内。 …

windows安装git并初始化

git官网下载地址&#xff1a; https://git-scm.com/downloads 安装步骤&#xff0c;一直点击下一步即可 git初始化 1、用户签名 git config --global user.email 2734542837qq.com#设置全局用户邮箱git config --global user.name "zoujiahao"# 设置全局用户使用人…

从零构建深度学习推理框架-6 构建计算图

PNNX PNNX项目 PyTorch Neural Network eXchange&#xff08;PNNX&#xff09;是PyTorch模型互操作性的开放标准。PNNX为PyTorch提供了一种开源的模型格式&#xff0c;它定义了与Pytorch相匹配的数据流图和运算图&#xff0c;我们的框架在PNNX之上封装了一层更加易用和简单的计…

ISC 2023︱诚邀您参与赛宁“安全验证评估”论坛

​​8月9日-10日&#xff0c;第十一届互联网安全大会&#xff08;简称ISC 2023&#xff09;将在北京国家会议中心举办。本次大会以“安全即服务&#xff0c;开启人工智能时代数字安全新范式”为主题&#xff0c;打造全球首场AI数字安全峰会&#xff0c;赋予安全即服务新时代内涵…

无涯教程-Perl - 环境配置

在开始编写Perl程序之前&#xff0c;让我们了解如何设置我们的Perl环境。 您的系统更有可能安装了perl。只需尝试在$提示符下给出以下命令- $perl -v 如果您的计算机上安装了perl&#xff0c;那么您将收到以下消息: This is perl 5, version 16, subversion 2 (v5.16.2) b…

JAVA SE -- 第十六天

&#xff08;全部来自“韩顺平教育”&#xff09; IO流 一、文件 是保存数据的地方 2、文件流 文件在程序中是以流的形式来操作 流&#xff1a;数据在数据源&#xff08;文件&#xff09;和程序&#xff08;内存&#xff09;之间经历的路径 输入流&#xff1a;数据从数据…

RISC-V基础之浮点指令(包含实例)

RISC-V体系结构定义了可选的浮点扩展&#xff0c;分别称为RVF、RVD和RVQ&#xff0c;用于操作单精度、双精度和四倍精度的浮点数。RVF/D/Q定义了32个浮点寄存器&#xff0c;f0到f31&#xff0c;它们的宽度分别为32位、64位或128位。当一个处理器实现了多个浮点扩展时&#xff0…

GD32F103待机模式与唤醒

GD32F103待机模式与唤醒&#xff0c;本程序使用RTC报警唤醒。 电源管理单元有3种省电模式:睡眠模式,深度睡眠模式和待机模式&#xff1b; 进入待机模式的步骤如下&#xff1a; 若需要RTC闹钟输出&#xff0c;则需要将TAMPER-RTC映射到PC13引脚; 若需要LXTAL晶振32.768KHz&…

Go 语言面试题(一):基础语法

文章目录 Q1 和 : 的区别&#xff1f;Q2 指针的作用&#xff1f;Q3 Go 允许多个返回值吗&#xff1f;Q4 Go 有异常类型吗&#xff1f;Q5 什么是协程&#xff08;Goroutine&#xff09;Q6 如何高效地拼接字符串Q7 什么是 rune 类型Q8 如何判断 map 中是否包含某个 key &#xf…

Python高阶技巧 正则表达式

正则表达式&#xff0c;又称规则表达式&#xff08;Regular Expression&#xff09;&#xff0c;是使用单个字符串来描述、匹配某个句法规则的字符串&#xff0c;常被用来检索、替换那些符合某个模式&#xff08;规则&#xff09;的文本。 简单来说&#xff0c;正则表达式就是使…

Prometheus + Grafana安装

Prometheus是一款基于时序数据库的开源监控告警系统&#xff0c;非常适合Kubernetes集群的监控。Prometheus的基本原理是通过HTTP协议周期性抓取被监控组件的状态&#xff0c;任意组件只要提供对应的HTTP接口就可以接入监控。不需要任何SDK或者其他的集成过程。这样做非常适合做…

Ceph入门到精通-远程开发Windows下使用SSH密钥实现免密登陆Linux服务器

工具&#xff1a; win10、WinSCP 服务器生成ssh密钥&#xff1a; 打开终端&#xff0c;使账号密码登录&#xff0c;输入命令 ssh-keygen -t rsa Winscp下载 Downloading WinSCP-6.1.1-Setup.exe :: WinSCP window 生成密钥 打开powershell ssh-keygen -t rsa 注意路径 …

Day10-NodeJS和NPM配置

Day10-NodeJS和NPM 一 Nodejs 1 简介 Nodejs学习中文网:https://www.nodeapp.cn/synopsis.html Nodejs的官网:https://nodejs.org/ 概念:Nodejs是JavaScript的服务端运行环境.Nodejs不是框架,也不是编程语言,就是一个运行环境. Nodejs是基于chrome V8引擎开发的一套js代码…

【雕爷学编程】Arduino动手做(184)---快餐盒盖,极低成本搭建机器人实验平台2

吃完快餐粥&#xff0c;除了粥的味道不错之外&#xff0c;我对个快餐盒的圆盖子产生了兴趣&#xff0c;能否做个极低成本的简易机器人呢&#xff1f;也许只需要二十元左右 知识点&#xff1a;轮子&#xff08;wheel&#xff09; 中国词语。是用不同材料制成的圆形滚动物体。简…

Python以及Pycharm保姆级的下载安装教程,看完就懂

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于Python的相关操作吧 目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 一.Python的安装 1.下载地址 2.下载步骤…

Netty+springboot开发即时通讯系统笔记(一)

业务部分从sql开始&#xff1a; /*Navicat Premium Data TransferSource Server : localhostSource Server Type : MySQLSource Server Version : 50740Source Host : localhost:3306Source Schema : im-coreTarget Server Type : MySQLTarge…