第三章:Electron主进程命令

欢迎回来🐻‍❄️

在第一章:渲染器用户界面(前端)中,我们探索了您与之交互的按钮和菜单。然后在第二章:AI模型中,我们了解了让您的图像看起来更棒的"智能"。您选择图像,选择模型,然后点击"Upscayl"。

但是在点击按钮和图像实际被放大之间发生了什么?谁将您的选择从用户界面转化为计算机上的操作?这就是Electron主进程命令的作用

Electron主进程命令解决了什么问题?

将Upscayl想象成一个繁忙的餐厅。渲染器用户界面(前端)是友好的服务员,接受您的订单(“使用’remacri-4x’模型放大这张图像”)。

AI模型是专门的食谱。但谁去厨房获取食材,告诉实际的厨师该做什么,并确保一切顺利进行?那就是Electron主进程

Electron主进程命令解决的核心问题是弥合基于web的用户界面与计算机操作系统之间的鸿沟。普通的网页(如前端)不能直接:

  • 在计算机上打开文件选择窗口。
  • 将文件保存到特定文件夹。
  • 运行强大的外部程序。
  • 发送系统通知。

主进程充当整个Upscayl应用程序的"控制中心"或"指挥"。它是Upscayl中唯一能够直接与计算机系统对话的部分,确保应用程序能够执行所有繁重的工作,并与操作系统和其他工具正确交互。

核心用例:协调图像放大

让我们使用主要示例:放大单张图像

当:

  1. 在渲染器用户界面(前端)中点击"选择图像"。
  2. 从计算机中选择图像文件。
  3. 选择一个AI模型(如remacri-4x)。
  4. 点击大的"Upscayl"按钮。

Electron主进程协调整个操作。它接收您的指令,准备所有必要的信息,启动实际的放大工作,监控其进度,并处理保存结果。

什么是Electron主进程?

要理解主进程,让我们简要回顾一下Upscayl构建工具Electron。Electron应用程序通常有两种主要类型的进程:

  • 渲染器进程(服务员):这是渲染器用户界面(前端)所在的地方。它像一个网页浏览器页面,非常适合显示视觉效果和处理点击,但对计算机系统的访问有限。
  • 主进程(厨师/经理):这是应用程序的"大脑"。它运行一个Node.js环境,这意味着它可以完全访问计算机的操作系统。它管理应用程序的窗口,处理系统事件,并执行渲染器进程无法完成的所有"繁重"任务。整个应用程序只有一个主进程。

Electron主进程命令只是渲染器进程发送给主进程的特定指令或"消息",要求它执行系统级任务。

主进程如何与前端通信

由于渲染器和主进程是分开的,它们需要一种相互通信的方式。这是通过**进程间通信(IPC)**实现的。

IPC: https://github.com/lvy010/linux-core/tree/main/ipc_test

想象服务员(前端)将您的订单写在票上并交给厨师(主进程)。票上有清晰的"命令"和所有细节。

在Upscayl中,这些"命令"使用特定名称定义:

// common/electron-commands.ts(简化版)
const ELECTRON_COMMANDS = {SELECT_FILE: "选择文件", // 命令主进程打开文件对话框UPSCAYL: "放大图像", // 命令主进程开始放大UPSCAYL_DONE: "放大完成", // 主进程向前端发送的消息UPSCAYL_PROGRESS: "从主进程发送进度到渲染器", // 进度更新STOP: "停止当前操作", // 停止放大的命令// ... 许多其他命令 ...
} as const;export { ELECTRON_COMMANDS };

这个ELECTRON_COMMANDS列表就像一个共享字典。渲染器用户界面(前端)和主进程都知道这些名称,确保它们在发送消息时相互理解。

当渲染器用户界面(前端)想要完成某件事时,它使用这些命令名称发送消息。当主进程完成任务或有更新时,它使用命令名称向前端发送消息。

放大命令的旅程

让我们追踪当点击"Upscayl"按钮时发生的情况,从用户界面到实际工作完成:

在这里插入图片描述

以下是图表的逐步解释:

  1. 用户交互:您(用户)在渲染器用户界面(前端)中点击"Upscayl"按钮。
  2. 收集信息RendererUI收集您提供的所有信息:原始图像的位置、选择的AI模型、期望的放大倍数(如4x)和其他设置。
  3. 发送命令RendererUI将这些信息打包成"消息",并使用UPSCAYL命令发送给Electron主进程。这条消息包含主进程需要知道的一切
  4. 主进程准备MainProcess接收UPSCAYL命令。然后执行系统级任务:确定正确的输出文件夹,创建唯一的文件名,并准备运行实际放大程序所需的所有参数。
  5. 启动放大二进制文件MainProcess然后启动一个独立的强大程序,称为放大二进制文件(upscayl-bin)。它将所有准备好的参数(图像路径、模型路径、输出路径、放大倍数等)传递给这个二进制文件。
  6. 放大工作放大二进制文件开始使用选定的AI模型进行实际的、计算密集的图像增强工作。
  7. 进度更新:当放大二进制文件工作时,它向MainProcess发送进度更新。
  8. 转发进度MainProcess接收这些进度更新,然后使用UPSCAYL_PROGRESS命令将它们发送回RendererUI。这就是看到进度条移动的方式
  9. 完成:一旦放大二进制文件完成,它告诉MainProcess它已完成,并提供新放大图像的路径。
  10. 最终通知和显示MainProcess发送最终的UPSCAYL_DONE命令,包括放大图像的路径,返回给RendererUIRendererUI然后显示惊人的结果,并可能向您显示系统通知。

这整个序列由主进程协调,充当中央指挥。

深入代码:如何处理命令

让我们看一些简化的代码片段,看看这些命令在Upscayl中是如何实际注册和处理的

在这里插入图片描述

1. 在主进程中注册命令

主进程需要知道当接收到特定命令时该做什么

这就像餐厅经理将任务分配给员工。在Electron中,这是使用ipcMain.on(对于仅执行操作的命令)或ipcMain.handle(对于返回值的命令)完成的。

// electron/index.ts(简化版)
import { app, ipcMain } from "electron";
import { ELECTRON_COMMANDS } from "../common/electron-commands";
import selectFile from "./commands/select-file"; // 选择文件的命令处理程序
import imageUpscayl from "./commands/image-upscayl"; // 放大命令的处理程序
import stop from "./commands/stop"; // 停止任务的命令处理程序app.on("ready", async () => {// ... 其他应用程序设置 ...// 注册命令:当前端发送SELECT_FILE时,运行'selectFile'函数ipcMain.handle(ELECTRON_COMMANDS.SELECT_FILE, selectFile);// 注册命令:当前端发送UPSCAYL时,运行'imageUpscayl'函数ipcMain.on(ELECTRON_COMMANDS.UPSCAYL, imageUpscayl);// 注册命令:当前端发送STOP时,运行'stop'函数ipcMain.on(ELECTRON_COMMANDS.STOP, stop);
});

这个electron/index.ts文件是主进程的入口点。它是应用程序开始监听来自渲染器用户界面(前端)的所有不同命令的地方。每个ipcMain.handleipcMain.on行将一个特定的ELECTRON_COMMANDS消息连接到一个将处理它的函数(如selectFileimageUpscayl)。

2. 处理"选择文件"命令

当您在渲染器用户界面(前端)中点击"选择图像"时,该组件发送一个SELECT_FILE命令。以下是主进程接收它时的操作:

// electron/commands/select-file.ts(简化版)
import { dialog } from "electron";
import { setSavedImagePath } from "../utils/config-variables";
import logit from "../utils/logit"; // 记录消息的辅助工具const selectFile = async () => {// 在计算机上打开一个本地文件选择对话框const { canceled, filePaths } = await dialog.showOpenDialog({properties: ["openFile"],title: "选择图像",filters: [{ name: "图像", extensions: ["png", "jpg", "jpeg"] }],});if (canceled) {logit("🚫 文件选择已取消");return null; // 如果用户取消,返回null} else {setSavedImagePath(filePaths[0]); // 保存路径以备下次使用logit("📄 选择的文件路径: ", filePaths[0]);return filePaths[0]; // 将选择的文件路径发送回前端}
};export default selectFile;

这个selectFile函数非常重要,因为它允许Upscayl与计算机的文件系统交互。当这个函数运行时,它使用dialog.showOpenDialog显示熟悉的"打开文件"窗口。如果您选择一个文件,它的路径(如C:/Users/您的名字/图片/image.jpg)将返回给渲染器用户界面(前端),然后显示图像。

3. 处理"放大图像"命令

这是最重要的一个!当发送UPSCAYL命令时,主进程中的imageUpscayl函数接管:

// electron/commands/image-upscayl.ts(简化版)
import { modelsPath } from "../utils/get-resource-paths"; // 内置AI模型的路径
import { ELECTRON_COMMANDS } from "../../common/electron-commands";
import { setChildProcesses } from "../utils/config-variables";
import { getSingleImageArguments } from "../utils/get-arguments"; // 构建参数的辅助工具
import { spawnUpscayl } from "../utils/spawn-upscayl"; // 运行放大程序的辅助工具
import { getMainWindow } from "../main-window";
import logit from "../utils/logit";const imageUpscayl = async (event, payload) => {const mainWindow = getMainWindow(); // 获取主窗口的引用if (!mainWindow) return;// 从前端传递的payload中提取所有设置const model = payload.model;const imagePath = payload.imagePath;const outputPath = payload.outputPath;const scale = payload.scale;// ... 以及payload中的许多其他设置 ...// 为放大二进制文件构建特定的命令行参数const args = getSingleImageArguments({inputDir: imagePath,model: model,modelsPath: modelsPath, // 提供AI模型文件的路径outFile: outputPath,scale: scale,// ... 所有其他参数 ...});// 启动实际的放大程序([放大二进制文件(`upscayl-bin`)])const upscaylProcess = spawnUpscayl(args, logit);setChildProcesses(upscaylProcess); // 跟踪这个正在运行的进程// 监听放大二进制文件的进度更新upscaylProcess.process.stderr.on("data", (data: string) => {// 将进度百分比发送回前端mainWindow.webContents.send(ELECTRON_COMMANDS.UPSCAYL_PROGRESS,data.toString(),);});// 监听放大程序何时完成upscaylProcess.process.on("close", async () => {logit("💯 放大完成");// 通知前端放大已完成mainWindow.webContents.send(ELECTRON_COMMANDS.UPSCAYL_DONE,outputPath,);// ... 执行最终任务,如显示通知 ...});
};export default imageUpscayl;

这个imageUpscayl函数是放大过程的终极"指挥"!

  1. 它接收payload(来自渲染器用户界面(前端)的所有选择的集合)。
  2. 然后使用辅助函数(getSingleImageArguments)构建外部放大二进制文件(upscayl-bin)运行所需的精确命令。
  3. spawnUpscayl函数然后执行放大二进制文件(upscayl-bin)作为一个独立的程序。
  4. 关键的是,它为这个运行的程序附加"监听器"(.on("data").on("close"))。这使得MainProcess能够持续监控进度,并确切知道放大何时完成。
  5. 然后它将这些更新转发回渲染器用户界面(前端),使用UPSCAYL_PROGRESSUPSCAYL_DONE等命令。

结论

Electron主进程命令是将在渲染器用户界面(前端)中的交互与计算机的系统级操作连接起来的重要纽带。

它充当"控制中心",解释意愿,协调复杂的任务(如文件操作和运行外部程序),并将反馈传递给您。没有这个关键组件,Upscayl无法在桌面上执行任何核心功能

现在我们已经了解了谁下达命令,在下一章中,我们将深入探讨实际执行繁重工作的组件放大二进制文件(upscayl-bin),这是Upscayl魔力背后的力量

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

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

相关文章

电竞护航小程序成品搭建三角洲行动护航小程序开发俱乐部点单小程序成品游戏派单小程序定制

功能列表:商家入驻 成为管事 平台公告 客服密钥 客服管理 发单模板 快捷发单 自定义发单 打手入驻 订单裁决 即时通讯 (接单者员与发单者) 打手排行 邀请排行 余额提现技术栈:前端uniapp 后端java

Redis数据库基础

1.关系型数据库和NoSQL数据库数据库主要分为两大类:关系型数据库与NoSQL数据库关系型数据库,是建立在关系模型基础是的数据库,其借助集合代数等数学概念和方法来处理数据库中的数据主流的MySQL,Oracle,MS SQL Server 和DB2都属于这…

【Java实战㉗】Java日志框架实战:Logback与Log4j2的深度探索

目录一、日志框架概述1.1 日志的作用1.2 常见日志框架1.3 日志级别二、Logback 框架实战2.1 Logback 依赖导入2.2 Logback 配置文件2.3 日志输出格式自定义2.4 Logback 进阶配置三、Log4j2 框架实战3.1 Log4j2 依赖导入3.2 Log4j2 配置文件3.3 Log4j2 与 SLF4J 整合3.4 日志框架…

基于WFOA与BP神经网络回归模型的特征选择方法研究(Python实现)

说明:这是一个机器学习实战项目(附带数据代码文档),如需数据代码文档可以直接到文章最后关注获取 或者私信获取。 1.项目背景 在大数据分析与智能建模领域,高维数据广泛存在于金融预测、环境监测和工业过程控制等场景…

​​AI生成PPT工具推荐,从此以后再也不用担心不会做PPT了​​

对于很多人老说,做ppt实在太麻烦了,快速制作出专业且美观的PPT成为众多人的需求,AI生成PPT工具应运而生,极大地提升了PPT制作的效率。以下为大家推荐多个实用的AI生成PPT工具。 1、AiPPT星级评分:★★★★★ AiPPT是一…

CentOS系统停服,系统迁移Ubuntu LTS

CentOS官方已全面停止维护CentOS Linux项目,公告指出 CentOS 7在2024年6月30日停止技术服务支持,(在此之前 2022年1月1日起CentOS官方已经不再对CentOS 8提供服务支持),详情见CentOS官方公告。 一、系统迁移评估 用户需要开始计…

Linux知识回顾总结----文件系统

上章讲的是 os 如果管理被打开的文件,那么没有被打开的文件(也就是在磁盘单中的文件)使用文件系统进行管理。了解完这一章,我们就可以理解我们如果想要打开一个文件的是如何找到整个文件,然后如何把它加载到内存中的&a…

iOS蓝牙使用及深入剖析高频高负载传输丢包解决方案(附源码)

最近开发了一套iOS原生的蓝牙SDK,总结了一些有价值的踩过的坑,分享出来给有需要的同学做个参考。 一、蓝牙的使用 iOS有一套封装好的完善的蓝牙API ,可以很便捷的实现与蓝牙的连接和通信,蓝牙通信的大体流程如下,先对基…

Python 正则表达式实战:用 Match 对象轻松解析拼接数据流

摘要 这篇文章围绕 Python 的正则表达式 Match 对象(特别是 endpos、lastindex、lastgroup 以及 group / groups 等方法/属性)做一个从浅入深、贴近日常开发场景的讲解。我们会给出一个真实又常见的使用场景:解析由设备/服务发来的“拼接式”…

基于Pygame的六边形战术推演系统深度剖析——从数据结构到3D渲染的完整实现(附完整代码)

1. 项目概述与技术选型 战术推演系统是军事训练和游戏开发中的重要组成部分,它能够模拟真实的战术场景,为用户提供策略思考的平台。本文将深入分析一套基于Python Pygame框架开发的城市巷战战术推演系统,该系统采用六边形网格布局,实现了恐怖分子与反恐精英的对抗模拟,具…

支持二次开发的代练App源码:订单管理、代练监控、安全护航功能齐全,一站式解决代练护航平台源码(PHP+ Uni-app)

一、技术架构:高性能与跨平台的核心支撑前端框架Uni-app:基于Vue.js的跨平台框架,支持编译至微信小程序、H5、iOS/Android App及PC端,代码复用率超80%,显著降低开发成本。实时通信:集成WebSocket实现订单状…

AI热点周报(8.31~9.6): Qwen3‑Max‑Preview上线、GLM-4.5提供一键迁移、Gemini for Home,AI风向何在?

名人说:博观而约取,厚积而薄发。——苏轼《稼说送张琥》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 目录一、3分钟速览版:一张表看懂本周AI大事二、国内:模型与生态的…

异步操作终止2

您提的这个问题非常棒,说明您思考得非常深入!您完全正确,我之前的示例中使用的 return; 会中断 handleDraw 函数中所有后续的逻辑,这在很多场景下并不是我们想要的。 我们的目标是只中断画图这一个特定的逻辑,而让函数…

《AI大模型应知应会100篇》第67篇 Web应用与大模型集成开发实践——1小时打造国产大模型智能客服系统

第67篇:Web应用与大模型集成开发实践——1小时打造国产大模型智能客服系统 一句话核心价值:无需翻墙!用Flask国产大模型API(通义/文心一言/讯飞)快速构建合规Web问答系统,电商客服人力成本直降70%&#xff…

python系列之综合项目:智能个人任务管理系统

不为失败找理由,只为成功找方法。所有的不甘,因为还心存梦想,所以在你放弃之前,好好拼一把,只怕心老,不怕路长。 python系列之文件操作:让程序拥有"记忆"的超能力!一、项目…

鸿蒙UI开发实战:解决布局错乱与响应异常

文章目录鸿蒙UI开发实战指南:解决ArkUI声明式布局错乱、组件不显示与事件响应异常引言ArkUI声明式开发的技术优势开发痛点与本文价值布局错乱问题常见原因固定像素单位使用不当布局嵌套层级过深Flex布局属性配置错误响应式布局缺失解决方案弹性单位适配:…

B.50.10.09-RPC核心原理与电商应用

RPC核心原理与电商应用实战 第1章:RPC核心概念与价值 1.1. 什么是 RPC? RPC (Remote Procedure Call),即远程过程调用,是一种允许一台计算机(客户端)上的程序,调用另一台计算机(服务…

【完整源码+数据集+部署教程】室内场景分割系统源码和数据集:改进yolo11-DWR

背景意义 研究背景与意义 随着智能家居和自动化技术的快速发展,室内场景理解在计算机视觉领域中变得愈发重要。室内场景分割不仅是计算机视觉的基础任务之一,也是实现智能家居、机器人导航、增强现实等应用的关键技术。传统的图像分割方法在处理复杂的室…

python入门常用知识

一、创建和快捷键 创建项目: New project创建模版:项目&代码的一种默认标记信息创建包(放代码的地方-方便整理分类更清晰) --- python package创建文本文件(配置文件):File创建文件夹(测试数据、测试报告、测试截图):Director…

原创未发表!POD-PINN本征正交分解结合物理信息神经网络多变量回归预测模型,Matlab实现

该代码实现了一个基于POD降维与物理信息神经网络(PINN)结合的回归预测模型,用于从高维数据中提取关键特征并进行物理约束下的数据驱动预测。一、主要功能 数据降维:使用POD(Proper Orthogonal Decomposition&#xff0…