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.mzph.cn/news/25636.shtml

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

相关文章

vscode 格式问题

1、EditorConfig for VS Code 插件 shift alt f 格式化文件&#xff08;VS Code格式化按键&#xff09;&#xff0c;如下图&#xff0c;每个缩进4空格 代码如下 创建文件名 .editorconfig root true [*] charset utf-8 indent_style space indent_size 2 end_of_…

Docker 启动 Nacos 报错:No DataSource set

​ &#x1f468;&#x1f3fb;‍&#x1f4bb; 热爱摄影的程序员 &#x1f468;&#x1f3fb;‍&#x1f3a8; 喜欢编码的设计师 &#x1f9d5;&#x1f3fb; 擅长设计的剪辑师 &#x1f9d1;&#x1f3fb;‍&#x1f3eb; 一位高冷无情的编码爱好者 大家好&#xff0c;我是 …

Microsoft Message Queuing Denial-of-Service Vulnerability

近期官方公布了一个MSMQ的拒绝服务漏洞&#xff0c;可能因为网络安全设备的更新&#xff0c;影响业务&#xff0c;值得大家关注。 漏洞具体描述参见如下&#xff1a; Name: Microsoft Message Queuing Denial-of-Service Vulnerability Description: Microsoft Message Queuing…

java 版本企业招标投标管理系统源码+多个行业+tbms+及时准确+全程电子化tbms

​ 功能描述 1、门户管理&#xff1a;所有用户可在门户页面查看所有的公告信息及相关的通知信息。主要板块包含&#xff1a;招标公告、非招标公告、系统通知、政策法规。 2、立项管理&#xff1a;企业用户可对需要采购的项目进行立项申请&#xff0c;并提交审批&#xff0c;查…

静态页面与动态页面的区别及部署jpress应用

简述静态网页和动态网页的区别 静态网页&#xff1a; 1、首先是静态网页&#xff0c;静态网页每个网页中都有一个固定的URL&#xff0c;网页URL以htm、HTML、jpg、.gif、.mp4等常见形式为后缀&#xff0c;而且不含有问号&#xff1b; 2、静态网页内容一经发布到网页服务器上…

Java 8:让你的代码更简洁、高效和灵活的新特性

Java 8 ——企业中使用最普遍的版本&#xff0c;那么了解它的新特性是非常有必要的 目录 一、函数式接口 二、Lamdba表达式 三、方法引用 四、Stream API 3.1 创建 方法一&#xff1a;通过集合 方法二&#xff1a;通过数组 方法三&#xff1a;通过Stream的of() 方法四…

《JeecgBoot系列》JeecgBoot(ant-design-vue) 识别字段中指定内容并修改该行文字颜色

JeecgBoot(ant-design-vue) 识别字段中指定内容并修改该行文字颜色 需求&#xff1a;将生产工厂是配件工厂的行改变颜色标注 一、修改table组件内容 在<a-table></a-table>内添加:rowClassName"tableRowClass" <a-table>...:rowClassName"t…

【Linux】从0到1实现一个进度条小程序

个人主页&#xff1a;&#x1f35d;在肯德基吃麻辣烫 我的gitee&#xff1a;gitee仓库 分享一句喜欢的话&#xff1a;热烈的火焰&#xff0c;冰封在最沉默的火山深处 文章目录 前言一、理解回车 \r 和换行 \n二、初步认识缓冲区1. 认识第一个函数&#xff1a;sleep2.观察缓冲区…

Hive终端命令行打印很多日志时,如何设置日志级别

示例&#xff1a;use test; 切换到test数据库时&#xff0c;输出很多日志信息不方便看结果&#xff0c;如下图。 解决方法&#xff1a; 退出hive命令行界面&#xff08;ctrlC&#xff09;执行“vi /usr/local/apache-hive-3.1.2-bin/conf/log4j.properties”命令&#xff0c;创…

Windows环境下VSCode安装PlatformIO Cero报错ERROR: HTTP error 403 while getting

安装PlatformIO插件成功&#xff0c;初始化失败 错误信息判断问题尝试访问https://pypi.tuna.tsinghua.edu.cn/simple/platformio/成功点击文件后报错如下&#xff1a; 解决问题- 换源 &#xff08; Windows下有两个地方需要更改&#xff09;cmd命令行Pip文件 总结&#xff1a;…

Python自动化测试之用Robot Framework进行自动化测试详解

概要 你还在手动测试&#xff1f;不妨了解一下更高效、准确且简单的测试方法——使用Python的Robot Framework进行自动化测试。 什么是Robot Framework&#xff1f; Robot Framework是一款开源的Python自动化测试框架&#xff0c;它基于关键字驱动的思想&#xff0c;具有易读、…

Autoware.ai1.14.0自动驾驶-Demo运行

Autoware.ai1.14.0自动驾驶-Demo运行 数据准备 下载数据&#xff1a; wget https://autoware-ai.s3.us-east-2.amazonaws.com/sample_moriyama_data.tar.gz wget https://autoware-ai.s3.us-east-2.amazonaws.com/sample_moriyama_150324.tar.gz一定要注意解压文件是在.auto…

比较 Java Enterprise Architecture 中的 MongoDB 和 Couchbase

​MongoDB和Couchbase是两种常用的NoSQL数据库&#xff0c;用于在Java实现的企业架构中存储和管理数据。以下是它们之间的主要差异、比较和权衡。 在当今快速发展的企业架构领域&#xff0c;MongoDB和Couchbase已经成为NoSQL数据库中两个重要的竞争者。本文全面探讨了这两个强…

【链表OJ 1】移除链表元素val

大家好&#xff0c;欢迎来到我的博客&#xff0c;此题是关于链表oj的第一题&#xff0c;此后还会陆续更新博客&#xff0c;如有错误&#xff0c;欢迎大家指正。 来源:https://leetcode.cn/problems/remove-linked-list-elements/description/ 题目: 方法一:定义prev和cur指针…

Prometheus服务器、Prometheus被监控端、Grafana、Prometheus服务器、Prometheus被监控端、Grafana

day03 day03Prometheus概述部署Prometheus服务器环境说明&#xff1a;配置时间安装Prometheus服务器添加被监控端部署通用的监控exporterGrafana概述部署Grafana展示node1的监控信息监控MySQL数据库配置MySQL配置mysql exporter配置mysql exporter配置prometheus监控mysql自动…

ApplicationContent 和BeanFactory的关系

选中这个类&#xff0c; ctrl alt u 从springboot的启动类说起 我们知道这个启动类返回值呢是哟个configurableApplicationContent 类型 我们查看她的类图 从图中我们可以看出&#xff0c;configurableApplicationContent是见解的继承了BeanFactory接口&#xff0c;扩展了他…

【传统视觉】C#创建、封装、调用类库

任务 因为实现代码相对简单&#xff0c;然后又没有使用Opencv&#xff0c;所以就直接用C#实现&#xff0c;C#调用。 1.创建类库 1.1新建一个类库 vs2015 > 文件 > 新建 > 项目 using System; using System.Collections.Generic; using System.Linq;namespace Yo…

LeetCode--HOT100题(23)

目录 题目描述&#xff1a;206. 反转链表&#xff08;简单&#xff09;题目接口解题思路代码 PS: 题目描述&#xff1a;206. 反转链表&#xff08;简单&#xff09; 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 LeetCode做题链接&…

git clone 登录 github

git clone 登录 github 目录概述需求&#xff1a; 设计思路实现思路分析1.github 设置setting2.输入passwd 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness,make a better result…

Android系统APP之SettingsProvider

前言 SettingsProvider顾名思义是一个提供设置数据共享的Provider&#xff0c;SettingsProvider和Android系统其它Provider有很多不一样的地方&#xff0c;如&#xff1a; SettingsProvider只接受int、float、string等基本类型的数据&#xff1b;SettingsProvider由Android系…