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找到对应窗口,然后主动通知窗口进行对应操作

请添加图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学习左耳听风栏目90天——第一天 1-90(学习左耳朵耗子的工匠精神,对技术的热爱)【洞悉技术的本质,享受科技的乐趣】

洞悉技术的本质&#xff0c;享受科技的乐趣 第一篇&#xff0c;我的感受就是 耗叔是一个热爱技术&#xff0c;可以通过代码找到快乐的技术人。 作为it从业者&#xff0c;我们如何可以通过代码找到快乐呢&#xff1f;这是一个问题&#xff1f; 至少目前&#xff0c;我还没有这种…

Vue [Day6]

路由进阶 路由模块的封装抽离 src/router/index.js import VueRouter from vue-router // 用绝对路径的方式来写目录 相当于src import Find from /views/Find import Friend from ../views/Friend import My from ../views/Myimport Vue from vue Vue.use(VueRouter)con…

在指定的 DSN 中,驱动程序和应用程序之间的体系结构不匹配

1.Cadence 17.2 配置CIS数据库报&#xff1a;ERROR(ORCIS-6245): Database Operation Failed 安装cadance17.2以上版本时&#xff0c;ERROR(ORCIS-6245): Database Operation Failed_收湾湾的博客-CSDN博客 原因是ODBC数据库没有配置&#xff0c;或者没有驱动&#xff0c; 驱…

Linux(进程间通信详解)

进程间通信&#xff0c;顾名思义&#xff0c;就是进程与进程之间互通信交流&#xff0c;OS保证了各进程之间相互独立&#xff0c;但这不意味着进程与进程之间就互相隔离开&#xff0c;在不少的情况下&#xff0c;进程之间需要相互配合共同完成某项6任务&#xff0c;这就要求各进…

产品体系架构202308版

1.前言 当我们不断向前奔跑时&#xff0c;需要回头压实走过的路。不断扩张的同时把相应的内容沉淀下来&#xff0c;为后续的发展铺垫基石。 不知从何时起&#xff0c;产品的架构就面向了微服务/中台化/前后端分离/低代码化/分布式/智能化/运行可观测化的综合体&#xff0c;让…

SpringCloud实用篇4——MQ RabbitMQ SpringAMQP

目录 1 初识MQ1.1 同步和异步通讯1.1.1 同步通讯1.1.2 异步通讯 1.2 技术对比 2.快速入门2.1 安装RabbitMQ2.1.1 单机部署2.1.2集群部署 2.2 RabbitMQ消息模型2.3.导入Demo工程2.4 入门案例2.4.1 publisher实现2.4.2 consumer实现 3 SpringAMQP3.1 Basic Queue 简单队列模型3.1…

Linux命令200例:mkdir用于创建目录(常用)

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;全栈领域新星创作者✌。CSDN专家博主&#xff0c;阿里云社区专家博主&#xff0c;2023年6月csdn上海赛道top4。 &#x1f3c6;数年电商行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &…

唐刘:TiDB 研发工程实践及 TiDB 人才观丨CCF 中国数据库暑期学校

在刚刚结束的 CCF 中国数据库暑期学校上&#xff0c; PingCAP 的研发副总裁唐刘分享了在 TiDB 研发过程中的工程实践经验和人才培养方法。目前&#xff0c;TiDB 已广泛应用于各行各业&#xff0c;有着庞大的用户基数&#xff0c;面临多样化的数据处理需求。PingCAP 通过开源、敏…

Git介绍及常用命令详解

一、Git的概述 Git是一个分布式版本控制工具&#xff0c;通常用来对软件开发过程中的源代码文件进行管理。 Git 会跟踪我们对文件所做的更改&#xff0c;因此我们可以记录已完成的工作&#xff0c;并且可以在需要时恢复到特定或以前的版本。Git 还使多人协作变得更加容易&…

研发工程师玩转Kubernetes——PVC通过storageClassName进行延迟绑定

不同的PV可以使用相同的StorageClass&#xff0c;它们是一对多的关系。 PV可以设置节点亲和性。比如下图&#xff0c;local-storage-class-waitforfirstconsumer-pv-ubuntuc只能在节点ubuntuc上&#xff1b;local-storage-class-waitforfirstconsumer-pv-ubuntud只能在节点ubu…

C语言笔试训练【第六天】

大家好&#xff0c;我是纪宁。今天是C语言笔试训练的第6天&#xff0c;加油&#xff01; 往期回顾&#xff1a; C语言笔试训练【第五天】 C语言笔试训练【第四天】 C语言笔试训练【第三天】 C语言笔试训练【第二天】 C语言笔试训练【第一天】 1、以下叙述中正确的是&…

学习Maven Web 应用

Maven Web 应用 本章节我们将学习如何使用版本控制系统 Maven 来管理一个基于 web 的项目&#xff0c;如何创建、构建、部署已经运行一个 web 应用。 创建 Web 应用 我们可以使用 maven-archetype-webapp 插件来创建一个简单的 Java web 应用。 打开命令控制台&#xff0c;…

esp8266使用arduinoJson与tft_espi库发生冲突解决方法

esp8266使用arduinoJson与tft_espi库发生冲突解决方法 arduinoJson与tft_espi库发生冲突解决方法下载arduinoJson5.0版本的&#xff0c;不要用最新版本 示范代码&#xff1a; // Copyright Benoit Blanchon 2014 // MIT License // // Arduino JSON library // https://git…

docker版jxTMS使用指南:使用jxTMS采集数据之一

本文讲解了如何jxTMS的数据采集与处理框架并介绍了如何用来采集数据&#xff0c;整个系列的文章请查看&#xff1a;docker版jxTMS使用指南&#xff1a;4.4版升级内容 docker版本的使用&#xff0c;请查看&#xff1a;docker版jxTMS使用指南 4.0版jxTMS的说明&#xff0c;请查…

GLSL用于图像处理

Pipeline 硬件处理顶点和片段的Pipeline 软件的输入 顶点着色器 顶点的glsl 输入–特殊全局变量 变量 类型 指定函数 描述 gl_ Vertex vec4 glVertex 顶点的全局空间坐标 gl_Color vec4 glColor 主颜色值 gl_SecondaryColor vec4 glSecondaryColor 辅助颜色值 gl_Normal …

Springboot项目集成Durid数据源和P6Spy以及dbType not support问题

项目开发阶段&#xff0c;mybatis的SQL打印有占位符&#xff0c;调试起来还是有点麻烦&#xff0c;随想整合P6Spy打印可以直接执行的SQL&#xff0c;方便调试&#xff0c;用的Durid连接池。 Springboot项目集成Durid <dependency><groupId>com.alibaba</group…

Redis基础命令大全

这里写目录标题 第一章、Redis 命令大全1.1&#xff09;通用命令语法&#xff1a;ping语法&#xff1a;dbsize语法&#xff1a;select db语法&#xff1a;flushdb语法&#xff1a;exit 或 quit语法&#xff1a;redis-cli 1.2&#xff09;Redis 的 Key 的操作命令语法&#xff1…

微信小程序 地图map(电子围栏圆形和多边形)

正常情况下是没有手机上画电子围栏的&#xff0c;公共平台上我也没找到&#xff0c;所以走了一个歪点子&#xff0c;就是给地图添加点击事件&#xff0c;记录点的位置&#xff0c;在画到电子围栏上就是添加电子围栏了&#xff0c;如果只是显示电子围栏就简单了 一、多边形电子…

机器人CPP编程基础-01第一个程序Hello World

很多课程先讲C/C或者一些其他编程课&#xff0c;称之为基础课程。然后到本科高年级进行机器人专业课学习&#xff0c;这样时间损失非常大&#xff0c;效率非常低。 C/单片机/嵌入式/ROS等这些编程基础可以合并到一门课中进行实现&#xff0c;这些素材已经迭代三轮以上&#xf…

ctfshow web93-98

web93 打开环境是一个代码审计题目 简单分析就是输入一个变量num&#xff0c;其值不能等于4476与包含字母&#xff0c;但是他的值需要为4476 函数intval作用为获取变量的整数值&#xff0c;第二个参数的意思是进制&#xff0c;默认为10进制。题目参数为0&#xff0c;就根据变…