[HarmonyOS] 解决HMRouter路由地址无法抽取的问题
解决HMRouter路由地址无法抽取的问题
背景
最近开始学习HarmonyOS开发,搭建项目的时候采用了 HMRouter
路由框架,在项目里使用到路由跳转,官方链接在这:
https://gitee.com/hadss/hmrouter/blob/master/HMRouterLibrary/README.md
但是发现一个比较严重的问题,就是路由地址无法抽取到一起进行管理,目前只能在当前的页面文件中写死路由地址,这样在项目里如果路由地址有修改,就需要在每一个页面文件里都进行修改,非常不方便。
上述表述可以用一个鲜明的例子来举证一下:
比如我们的项目结构如下:
harmony_os(项目名)|-entry|-features(业务组件模块路径)|-home(首页模块)|-mine(我的模块)|-...(其他业务模块)|-commons(公共组件模块路径)|-lib_net(网络组件)|-router_scheme(路由地址管理组件)|-...(其他公共组件)
大致如上的结构,我们希望的目标是,能够 在 router_scheme
模块里定义了所有路由地址常量,然后对于需要注册路由的 module,都来依赖这个 router_scheme
模块,这样在 router_scheme
模块里定义的路由地址常量,就能被其他 module 引用,从而避免在每一个页面文件里都写死路由地址,方便维护。
比如 将所有的 路由地址定义的常量存放到一个类或者N个类中(可以根据不同的业务module来拆分不同的类文件存放)
export class RouterConstants {public static readonly router_name_1: string = "router_name_1_value"public static readonly router_name_2: string = "router_name_2_value"public static readonly router_name_3: string = "router_name_3_value"public static readonly DemoNetPage: string = "routerscheme://entry/DemoNetPage"public static readonly DialogPage: string = "routerscheme://entry/DialogPage"public static readonly ProgramPage: string = "routerscheme://entry/ProgramPage"
}
如下图所示,红色的是路由 module,用来存放所有的路由常量类;绿色的是需要依赖路由常量类的 module,比如 feature1
、entry
模块,只需要依赖 router_scheme
模块,然后就可以直接引用 router_scheme
模块里定义的路由常量了。
但是。。。。。理想很丰满,现实很骨感啊。。。。。。。。。官方gitee 上好多 issue都提出,如果将常量抽取到单独的 har 中,会识别不到。。。
备用链接
但是本着 办法总比困难多 的想法,还是想到了一个折中的实现方案。。。
实现方案
我们的初始目标是希望能够将所有的路由地址常量存放到一个类或者N个类中,然后对于需要注册路由的 module,都来依赖这个 router_scheme
模块,这样在 router_scheme
模块里定义的路由地址常量,就能被其他 module 引用,从而避免在每一个页面文件里都写死路由地址,方便维护。
那么现在既然官方不支持,或者说是还没支持,那我们就要想个办法,先将所有的路由常量集中到一个类中去,这样万一后续他们支持了,迁移也很方便了~~~
如下简述实现方案,技术有限,仅供参考哈~~~
主要分这么几个步骤:
- 1.实现插件,通过插件将常量类写入到每一个需要支持路由的module中,并且统一命名
- 2.添加路由键值对映射配置表(其实就是你所有的路由名字与路由地址的映射表),便于第一步的插件识别用来生成路由类
- 3.执行插件
- 4.代码引用
1.实现 HarmonyOS plugin
通过官方文档,查找到编写插件的逻辑,实现该插件,插件的主要目的是将路由映射表插入到每一个需要支持路由的 module 中,并且统一命名,方便插件识别。
将如下的 plugin 代码,命名为 RouterNamesGeneratePlugin.ts
,放在 config
文件夹下,然后在项目的根路径的 hvigorfile.ts
中引入,如下所示:
这样后续只要执行 sync
就会执行下述插件代码
源码如下:
import { FileUtil, hvigor, getNode, HvigorNode, HvigorTask, HvigorPlugin } from '@ohos/hvigor';// 实现自定义插件,sync的时候自动生成路由类
export function RouterNamesGeneratePlugin(): HvigorPlugin {// 路由表JSON文件地址let namesFilePath = "config/router_names.json5"// 路由生成规则配置文件地址let configFilePath = "config/router_config.json5"// 路由类文件名称let fileName = "RouterConstants"return {pluginId: 'RouterNamesGenerate',apply(node: HvigorNode) {// 路由数据源let routerNames = FileUtil.readJson5(namesFilePath)let routerList = routerNames['rent'] // 路由对象列表if (!routerList) {console.log(`debug_hvigorfile: routerList is null`)return}// 路由配置表let routerConfig = FileUtil.readJson5(configFilePath)let moduleNames = routerConfig['moduleNames'] // 路由对象列表if (!moduleNames) {console.log(`debug_hvigorfile: moduleNames 配置的module为空,不生成路由类 `)return}console.log(`debug_hvigorfile: 路由配置表 ↓↓↓↓↓↓↓↓↓↓↓↓`)moduleNames.forEach(element => {console.log(`debug_hvigorfile: moduleName=${element}`)})console.log(`debug_hvigorfile: 路由配置表 ↑↑↑↑↑↑↑↑↑↑↑↑`)console.log(`debug_hvigorfile: 路由表原始数据 ↓↓↓↓↓↓↓↓↓↓↓↓`)routerList.forEach(element => {console.log(`debug_hvigorfile: key=${element["key"]}, value=${element["value"]}`)})console.log(`debug_hvigorfile: 路由表原始数据 ↑↑↑↑↑↑↑↑↑↑↑↑`)// 获取所有节点const allNodes = hvigor.getAllNodes();for (let i = 0; i < allNodes.length; i++) {let nodeName = allNodes[i].getNodeName()let nodeDir = allNodes[i].getNodeDir()let getPath = nodeDir.getPath()// console.log(`debug_hvigorfile: module: nodeName=${nodeName}, getPath=${getPath}`)if (moduleNames.includes(nodeName)) {// console.log(`debug_hvigorfile: module: nodeName=${nodeName}, getPath=${getPath} 可以写入`)let newFilePath = getPath + `/src/main/ets/${fileName}.ets`// 判断是否存在FileUtil.ensureFileSync(newFilePath)let exist2 = FileUtil.exist(newFilePath)// console.log(`debug_hvigorfile: exist2: ${exist2}`)let date = new Date()let formatDate = date.toLocaleString()let tips = `// 自动生成,请勿修改 \n// 生成时间:${formatDate}`let a = `${tips} \nexport class ${fileName} {\n\t`let length = routerList.lengthfor (let j = 0; j < length; j++) {let element = routerList[j]// console.log(`debug_hvigorfile: 开始写入文件>>>>> key=${element["key"]}, value=${element["value"]}`)let key = element["key"]let value = element["value"]let prefix = (j == length - 1) ? "\n" : "\n\t"a += `public static readonly ${key}: string = "${value}"${prefix}`}a += `}`// 备注:这个 写入文件,不要使用异步写入,异步写入的话会存在先执行 HMRouter 的插件的case,就容易出问题了,需要保证在执行 HMRouter 插件之前,生成完所有的路由映射类FileUtil.writeFileSync(newFilePath, a)console.log(`debug_hvigorfile: moduleName[${nodeName}]: 写入完成`)}}// FileUtil.readFile('entry/test.txt').then(function(data) {// console.log('readFile: ' + data);// });}}
}
export default {system: appTasks,plugins: [RouterNamesGeneratePlugin()]
}// 注册Task, 用于在添加路由之后,执行此任务来重新生成路由类
// 执行: hvigorw generateRouterNames 即可重新生成新的路由类
node.registerTask({name: 'generateRouterNames',run() {// 自动执行 RouterNamesGeneratePlugin}
});
2.添加配置信息
在项目的根路径下,新建 config
目录,将上述的 RouterNamesGeneratePlugin.ts
文件放进去,然后新建下述两个 json5 文件
- 1.router_names.json5:用于存放所有的路由映射关系,json5的格式存储,键值对存储便于记录
- 2.router_config.json5:用于配置那些 module 需要生成路由类,格式具体参考下方
举例:
router_names.json5 文件的内容规范如下:
- rent: 便于后续区分不同的业务线,目前只设置这一个也行
- key: 路由的名字,也就是最终在Page文件中的路由名称
- value: 路由的具体地址
{"rent": [{"key": "DemoNetPage","value": "routerscheme://entry/DemoNetPage"},{"key": "DialogPage","value": "routerscheme://entry/DialogPage"},{"key": "ProgramPage","value": "routerscheme://entry/ProgramPage"}]
}
router_config.json5 文件的内容规范如下:
- moduleNames: 用于配置需要生成路由类的module名字,需要在这配置一下
比如我的例子中,是要在 feature1
和 entry
两个 module 中生成路由类,那么就将这俩module的名字配置一下。。。
{// 配置:需要生成路由类的module名字,需要在这配置一下"moduleNames": ["entry","feature1"]
}
3.执行插件
上述第一、第二步完成之后,就可以执行插件了,执行命令如下:
在项目根路径中的命令行中执行: hvigorw generateRouterNames 即可重新生成新的路由类;或者后续每次添加新的路由映射,也可以用它来执行重新生成路由映射类。
或者直接在项目根路径的 hvigorfile.ts
中随便回车一下,触发 sync
也可以执行构建。
hvigorw generateRouterNames
插件执行完毕后,会在 entry
和 feature1
两个 module 中生成 RouterConstants.ets
文件,如下图所示:
4.代码引用
完成上述三步之后,那么在模块中就可以直接引用了,比如 我定义了 router_name_3 这个路由,那么在模块中就可以这样引用了:
import { RouterConstants } from “…/RouterConstants”;
@HMRouter({ pageUrl: RouterConstants.router_name_3 })
就这么简单~~~~~~
import { HMRouter } from "@hadss/hmrouter";
import { RouterConstants } from "../RouterConstants";@HMRouter({ pageUrl: RouterConstants.router_name_3 })@Entry
@Component
export struct MainPage {@State message: string = 'Hello feature1_MainPage: ' + RouterConstants.router_name_3;build() {Row() {Column() {Text(this.message).fontSize(10).fontWeight(FontWeight.Bold)}.width('100%')}.height('100%')}
}
至此,完结有需要的小伙伴拿走不谢~
更加希望 HMRouter 后续能够支持常量抽取~~~
感谢~~~
相关文章:
[HarmonyOS] 解决HMRouter路由地址无法抽取的问题
解决HMRouter路由地址无法抽取的问题 背景 最近开始学习HarmonyOS开发,搭建项目的时候采用了 HMRouter 路由框架,在项目里使用到路由跳转,官方链接在这: https://gitee.com/hadss/hmrouter/blob/master/HMRouterLibrary/README…...
七天掌握SQL--->第四天:事务处理与并发控制
# 7天掌握SQL - 第四天:事务处理与并发控制 ## 目标 - 学习事务处理的基本概念,如ACID特性。 - 掌握并发控制的方法,如锁机制、事务隔离级别等。 - 通过实际案例练习事务处理和并发控制。 ## 1. 事务处理的基本概念 事务处理是数据库管理系…...
Docker学习笔记整理
这周不知道写点啥内容做个分享,但还是秉持学会分享的精神,粗略放一些Docker相关的问题和解答吧,后面有机会再补补再深挖深挖o(>﹏<)o 1. 容器VS虚拟机 虚拟机是一种带环境安装的解决方案(资源完全隔离),有以下缺…...
PIMPL模式和D指针
一、PIMPL模式概念: Pimpl(pointer to implementation, 指向实现的指针)是一种用来对“类的接口与实现”进行解耦合的方法。就是将真正的实现细节的Implementor从类定义的头文件中分离出去,公有类通过一个私有指针指向隐藏的实现类…...
Linux入门系列--文件与目录
一、介绍 在Linux中,有着一句话,叫做:一切皆文件。也就是任何东西都是以文件的形式存储的。 目录结构 bin:全程binary,含义是二进制。该目录中存储的都是一些二进制文件。我们学过C/C,其实也都知道机器能…...
论文阅读——Intrusion detection systems using longshort‑term memory (LSTM)
一.基本信息 论文名称:Intrusion detection systems using longshort‑term memory (LSTM) 中文翻译:基于长短期记忆(LSTM)的入侵检测系统 DOI:10.1186/s40537-021-00448-4 作者:FatimaEzzahra Laghrissi1* , Samira Douzi2*, Kha…...
平面点排序(结构体专题)
(1) 题目描述 平面上有n个点,坐标均为整数。请按与坐标原点(0,0)距离的远近将所有点排序输出。可以自己写排序函数,也可以用qsort库函数排序。 输入描述 输入有两行,第一行是整数n(1<n<10)ÿ…...
QT 实现仿制 网络调试器(未实现连接唯一性) QT5.12.3环境 C++实现
网络调试助手: 提前准备:在编写代码前,要在.pro工程文件中,添加network模块。 服务端: 代码: widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QtWidgets> #inclu…...
搜索引擎中广泛使用的文档排序算法——BM25(Best Matching 25)
在搜索场景中,BM25能计算每个文档与查询的匹配度,从中找出最相关的文档,并按相关性高低排序展示。 要理解BM25,需要掌握以下几个关键概念: 1. 词频(Term Frequency, TF):某关键词在文…...
文件上传需要考虑的安全性问题及解决方案
恶意文件上传:攻击者可能上传包含恶意代码的文件,如病毒、木马等,这些文件被服务器执行后,可能完全控制服务器或破坏服务器安全。为避免这种情况,应实施严格的文件验证策略,只允许特定的安全文件类型上传&a…...
论文笔记:Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks
1. 挑战/问题(Challenges/Issues): 这篇论文探讨了大型预训练语言模型在处理知识密集型自然语言处理(NLP)任务时面临的挑战。尽管这些模型在参数中存储了大量事实知识,并在微调后能够在下游NLP任务中取得很…...
Web 网络安全
一. 浏览器系统安全方面,使用多进程方案,而js主线程运行在渲染进程中,渲染进程时运行在沙箱中的,没有对本地OS文件的直接读写权限,所以需要通过IPC与浏览器主线程通信,才可以获取cookie等信息,这…...
Android Gradle 插件和 Android Studio 兼容性
Android Gradle 插件和 Android Studio 兼容性 Android Studio 版本所需的 AGP 版本Ladybug 2024.2.13.2-8.7Ladybug 2024.2.13.2-8.7Koala 2024.1.12024.2.1Jellyfish 2023.3.12024.2.1Iguana 2023.2.13.2-8.3Hedgehog 2023.1.13.2-8.2Giraffe 2022.3.13.2-8.1Flamingo 2022.…...
C++设计模式-策略模式-StrategyMethod
动机(Motivation) 在软件构建过程中,某些对象使用的算法可能多种多样,经常改变,如果将这些算法都编码到对象中,将会使对象变得异常复杂;而且有时候支持不使用的算法也是一个性能负担。 如何在运…...
【H2O2|全栈】JS案例章节(四)——使用原型的JS工厂模式
目录 前言 开篇语 准备工作 需求 工厂模式 概念 优点 添加元素的新方法 分析案例 HTML代码 JS实现 结束语 前言 开篇语 本系列为短章节,单独讲述部分特殊重点案例,本期讲述使用原型来实现JS的工厂模式。 与HTML和CSS相比,JS加…...
.NET9 - 新功能体验(三)
书接上回,我们继续来聊聊.NET9和C#13带来的新变化。 01、Linq新方法 CountBy 和 AggregateBy 引入了新的方法 CountBy 和 AggregateBy后,可以在不经过GroupBy 分配中间分组的情况下快速完成复杂的聚合操作,同时方法命名也非常直观࿰…...
论文概览 |《Journal of Urban Technology》2024 Vol.31 Issue.2
本次给大家整理的是《Journal of Urban Technology》杂志2024年第31卷第2期的论文的题目和摘要,一共包括6篇SCI论文! 论文1 Aerial Video Surveillance in a Megacity: A Case Study in Santiago, Chile 大城市中的空中视频监控:智利圣地亚哥…...
Makefile 之 自动化变量
作用范围只在这条规则以及连带规则中,所以其值也只在作用范围内有效。而不会影响规则链以外的全局变量的值。 "$" 表示目标的集合,就像一个数组,"$"依次取出目标,并执于命令。 "$<"和"$&qu…...
【C语言】const修饰符在指针变量中的作用详解
博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C语言 文章目录 💯前言💯指针与解引用:基础概念1. 指针变量2. 解引用操作 💯const 修饰指针变量的三种主要情况1. 情况一:int * const p (指针本…...
阿里云ECS服务器监控报警配置
背景:服务器偶尔会异常,比如CPU过载,磁盘满,影响使用,人工盯服务器不现实 采用方法:阿里云监控告警功能 步骤: 第一步:登录阿里云服务器 https://account.aliyun.com/login/logi…...
高性能linux服务器运维实战小结 性能调优工具
性能指标 进程指标 进程关系 父进程创子进程时,调fork系统调用。调用时,父给子获取一个进程描述符,并设置新的pid,同事复制父进程的进程描述符给子进程,此时不会复制父进程地址空间,而是父子用相同地址空…...
初识Linux—— 基本指令(下)
前言: 本篇继续来学习Linux的基础指令,继续加油!!! 本篇文章对于图片即内容详解,已同步到本人gitee:Linux学习: Linux学习与知识讲解 Linux指令 1、查看文件内容的指令 cat cat 查看文件…...
【Linux】线程的互斥和同步
【Linux】线程的互斥和同步 线程间的互斥 临界资源:多线程执行共享的资源就叫做临界资源临界区:每个线程内部,访问临界资源的代码,就叫做临界区互斥:任何时刻,互斥保证有且只有一个执行流进入临界区&#…...
详解Oracle表的类型(二)
1.引言: Oracle数据库提供了多种表类型,以满足不同的数据存储和管理需求。本博文将对Oracle分区表及使用场景进行详细介绍。 2. 分区表 分区表是Oracle数据库中一种重要的表类型,它通过将表数据分割成多个逻辑部分来提高查询性能、管理灵活…...
VSCode 下载 安装
VSCode【下载】【安装】【汉化】【配置C环境(超快)】(Windows环境)-CSDN博客 Download Visual Studio Code - Mac, Linux, Windowshttps://code.visualstudio.com/Downloadhttps://code.visualstudio.com/Download 注意࿰…...
java中的最小堆
概述 最小堆minHeap指的级别n的每个节点存储的值小于或等于级别n1的子节点的值。因此,根就存储了其中最小的值。 注意节点的值与其他兄弟节点的值之间没有必然关系。 java中最小堆的表示 利用数组 常用的是利用数组minHeap[]表示,将最小堆的节点或值…...
ES实用面试题
一、es是什么,为什么要用它? ES通常是Elasticsearch的简称,它是一个基于Lucene构建的开源搜索引擎。Elasticsearch以其分布式、高扩展性和实时数据分析能力而闻名,广泛用于全文搜索、日志分析、实时监控等多种场景。 基本特点&am…...
数据结构 (7)线性表的链式存储
前言 线性表是一种基本的数据结构,用于存储线性序列的元素。线性表的存储方式主要有两种:顺序存储和链式存储。链式存储,即链表,是一种非常灵活和高效的存储方式,特别适用于需要频繁插入和删除操作的场景。 链表的基本…...
数据结构:链表进阶
链表进阶 1. ArrayList的缺陷2. 链表2.1 链表的概念及结构2.2 链表的实现 3.链表面试题4.LinkedList的使用5.1 什么是LinkedList4.2 LinkedList的使用 5. ArrayList和LinkedList的区别 1. ArrayList的缺陷 通过源码知道,ArrayList底层使用数组来存储元素࿱…...
Can UDS 学习记录
目录 Can UDS 学习记录10 03 响应否定响应22和24 的说明27服务肯定响应抑制位 Can UDS 学习记录 10 03 响应 否定响应22和24 的说明 0x22条件不正确,就是不满足服务端的运行条件0x24请求顺序错误;停止例程的请求必须在开始例程后面才可以,请…...
C 语言实现的优先级队列
C 语言实现的优先级队列 priorityqueue.h /******************************************************************************* * Copyright © 2024-2025 Light Zhang <mapawarehotmail.com>, MapAware, Inc. * * ALL RIGHTS RESERVED. …...
卷积神经网络(CNN)中的批量归一化层(Batch Normalization Layer)
批量归一化层(BatchNorm层),或简称为批量归一化(Batch Normalization),是深度学习中常用的一种技术,旨在加速神经网络的训练并提高收敛速度。 一、基本思想 为了让数据在训练过程中保持同一分布…...
HDR视频技术之四:HDR 主要标准
HDR 是 UHD 技术中最重要维度之一,带来新的视觉呈现体验。 HDR 技术涉及到采集、加工、传输、呈现等视频流程上的多个环节,需要定义出互联互通的产业标准,以支持规模化应用和部署。本文整理当前 HDR 应用中的一些代表性的国际标准。 1 HDR 发…...
下一个阶段的生产工具更换:
开源竞争: 当你无法彻底掌握技术的时候,就开源这个技术,让更多的人了解这个技术,形成更多的技术依赖,你会说,这不就是在砸罐子吗?一个行业里面总会有人砸罐子的,你不如先砸罐子&…...
性能优化--CPU微架构
一 指令集架构 Intel X86, ARM v8, RISC-V 是当今广泛使用的指令架构的实例。 大多数现代架构可以归类为基于通用寄存器的加载和存储型架构,在这种架构下,操作数倍明确指定,只能使用夹在和存储指令访问内存。除提供基本的功能之外,…...
3.3_1 差错控制(检错编码)
目录 1、差错来源 全局性 局部性 2、数据链路的差错控制 编辑奇偶校验码 CRC循环冗余码 接收端检错过程 1、差错来源 概括来说,传输中的差错都是由于噪声引起的。 全局性 由于线路本身电气特性所产生的随机噪声(热噪声),是信道固有的…...
2024年wordpress、d-link等相关的多个cve漏洞poc
⚠️ 漏洞 ✅ CVE-2024-10914 在D-Link DNS-320、DNS-320LW、DNS-325和DNS-340L中发现的漏洞,版本直到20241028 GET /cgi-bin/account_mgr.cgi?cmdcgi_user_add&name%27;id;%27 HTTP/1.1✅ CVE-2024-11305 在Altenergy Power Control Software中发现的关键…...
影视后期学习Ⅰ~
1.DV是光盘 磁带 2.序列就是我们要制作的一个视频。 打开界面显示: 一号面板放的是素材,二号面板叫源监视器面板(它的名字需要记住)在一号面板点击文件之后,进入二号面板,在二号面板预览没问题后…...
如何安全删除 Linux 用户帐户和主目录 ?
Linux 以其健壮性和灵活性而闻名,是全球服务器和桌面的首选。管理用户帐户是系统管理的一个基本方面,包括创建、修改和删除用户帐户及其相关数据。本指南全面概述了如何在 Linux 中安全地删除用户帐户及其主目录,以确保系统的安全性和完整性。…...
【软件测试】设计测试用例的万能公式
文章目录 概念设计测试用例的万能公式常规思考逆向思维发散性思维万能公式水杯测试弱网测试如何进行弱网测试 安装卸载测试 概念 什么是测试用例? 测试⽤例(Test Case)是为了实施测试⽽向被测试的系统提供的⼀组集合,这组集合包…...
【MySQL】字符集与排序规则
1. 字符集 1.1 一些重要的字符集 1.1.1 ASCII 共收录128个字符,包括空格、标点符号、数字、大小写字母和一些不可见字符。由于总共才128个字符,所以可以使用1个字节来进行编码 1.1.2 ISO-8859-1 共收录 256 个字符,是在 ASCII 字符集的基…...
局域网与广域网:探索网络的规模与奥秘(3/10)
一、局域网的特点 局域网覆盖有限的地理范围,通常在几公里以内,具有实现资源共享、服务共享、维护简单、组网开销低等特点,主要传输介质为双绞线,并使用少量的光纤。 局域网一般是方圆几千米以内的区域网络,其特点丰富…...
C++从零到满绩——类和对象(中)
目录 1>>前言 2>>构造函数(我称之为初始化函数) 3>>析构函数(我称之为销毁函数) 4>>拷贝构造函数(我称之为复制函数) 5>>运算符重载 5.2>>赋值运算符重载 编辑…...
MFC工控项目实例三十一模拟量转化为工程量
实测工程量值(变送器量程最大值-变送器量程最小值)/(数字量最大值-数字量最小值)*(当前采集工程量值-零点误差值)。 相关程序代码 SEAL_PRESSURE.h class CSEAL_PRESSUREApp : public CWinApp { public:C…...
ESP32学习笔记_FreeRTOS(2)——Queue
摘要(From AI): 在嵌入式系统开发中,任务之间的高效通信是实现多任务协作的关键。FreeRTOS 提供了强大的队列机制,支持任务之间安全、灵活地传递数据,是实现任务同步和事件通知的核心工具。本篇博客将全面解析 FreeRTOS 队列的工作原理和应用…...
Project Manager工程管理器详细说明
1前言 STM32CubeMX的Project Manager工程管理器包含:Project工程管理、 Code Generator代码生成、 Advanced Settings高级设置三部分内容。 这三部分内容决定了工程的一些属性,相关的配置信息比较重要,也容易理解。初学者有必要掌握其中内容。 2Project工程管理 Project工…...
vue el-table表格点击某行触发事件操作栏点击和row-click冲突问题
文章为本新手菜鸡的问题记录,如有错误和不足还请大佬指正 文章目录 前言一、点击el-table表格某行,触发事件二、解决el-table的操作栏点击和row-click冲突问题1.问题:2.解决方法 前言 文章主要解决两个问题: 1、点击el-table表格…...
吸猫毛空气净化器哪个好?推荐除猫毛效果好的宠物空气净化器品牌
我家里养了五只猫咪,每天睡醒准备来杯咖啡的时候,总能看见猫毛。最尴尬的是这种现象,哪哪都有。养猫人真的每天都要生活在这个世界里面。平时和猫咪玩耍的时候也没有发现这么多猫毛啊。现在一到冬天不能开窗户,真的超级难受感觉每…...
Reactor 模式的理论与实践
1. 引言 1.1 什么是 Reactor 模式? Reactor 模式是一种用于处理高性能 I/O 的设计模式,专注于通过非阻塞 I/O 和事件驱动机制实现高并发性能。它的核心思想是将 I/O 操作的事件分离出来,通过事件分发器(Reactor)将事…...
VSCode 汉化教程【简洁易懂】
VSCode【下载】【安装】【汉化】【配置C环境(超快)】(Windows环境)-CSDN博客 我们安装完成后默认是英文界面。 找到插件选项卡,搜索“Chinese”,找到简体(更具你的需要)(…...