Qt获取CPU使用率及内存占用大小
Qt 获取 CPU 使用率及内存占用大小
文章目录
- Qt 获取 CPU 使用率及内存占用大小
- 一、简介
- 二、关键函数
- 2.1 获取当前运行程序pid
- 2.2 通过pid获取运行时间
- 2.3 通过pid获取内存大小
- 三、具体实现
- 五、写在最后
一、简介
近期在使用软件的过程中发现一个有意思的东西。如下所示:
该软件可以显示 CPU
使用率及内存大小和内存使用率。感觉比较有意思,于是就想着能不能通过 Qt
自己实现一套这样的东西,这也是本文的由来。
那么,言归正传,本文将介绍 如何使用 Qt
获取当前软件的 CPU
使用率及内存大小。本文适合对 Qt
有一些基础的朋友,对于一些简单的地方我不会过多赘述,望谅解!!!
另外,本文阐述方法不适用于 Linux
,需要注意!!!
首先,我使用的环境如下所示:
- Windows 10 x64
- Qt 5.12.3
二、关键函数
本文专注于解决获取 Qt
当前运行程序的 CPU
使用率及内存大小,因此本文通过获取当前运行程序 pid
的形式获取运行时间,通过运行时间计算得到 CPU
使用率。
2.1 获取当前运行程序pid
在 Qt
中,可以通过如下所示的语句获取当前程序 PID
:
QApplication::applicationPid();
2.2 通过pid获取运行时间
首先,需要打开进程句柄,需要使用到如下所示的函数:
HANDLE OpenProcess(DWORD dwDesiredAccess, BOOL bInheritHandle, DWORD dwProcessId
);
其中三个参数意义如下所示:
dwDesiredAccess
: 进程访问权限bInheritHandle
: 是否允许子进程继承此句柄,通常设为FALSE
dwProcessId
: 目标进程的PID
(进程标识符)
返回值意义如下所示:
- 成功:返回进程句柄(
HANDLE
) - 失败:返回
NULL
,需调用GetLastError()
获取错误码
更详细的解释在官方网站:OpenProcess 函数 (processthreadsapi.h) - Win32 apps | Microsoft Learn
如若链接点击无法跳转,可自行复制打开:
- https://learn.microsoft.com/zh-cn/windows/win32/api/processthreadsapi/nf-processthreadsapi-openprocess
其次,我们需要通过 PID
获取运行时间信息,需要使用到如下所示的函数:
BOOL GetProcessTimes(HANDLE hProcess,LPFILETIME lpCreationTime,LPFILETIME lpExitTime,LPFILETIME lpKernelTime,LPFILETIME lpUserTime
);
其参数意义如下所示:
hProcess
: 进程句柄lpCreationTime
: 进程的创建时间lpExitTime
: 进程的退出时间lpKernelTime
: 内核模式(如系统调用)下消耗的CPP
时间lpUserTime
: 用户模式(应用程序代码)下消耗的CPU
时间
返回参数意义如下所示:
- 成功:返回
TRUE
(非零值) - 失败:返回
FALSE
(零值),需调用GetLastError()
获取错误码
更详细的解释在官方网站:getProcessTimes 函数 (processthreadsapi.h) - Win32 apps | Microsoft Learn
如若链接点击无法跳转,可自行复制打开:
- https://learn.microsoft.com/zh-cn/windows/win32/api/processthreadsapi/nf-processthreadsapi-getprocesstimes
2.3 通过pid获取内存大小
获取进程使用内存大小,需要使用如下所示函数:
BOOL GetProcessMemoryInfo(HANDLE Process, PPROCESS_MEMORY_COUNTERS ppsmemCounters, DWORD cb
);
其参数意义如下所示:
Process
: 进程句柄ppsmemCounters
: 指向PROCESS_MEMORY_COUNTERS
结构的指针,用于接收内存统计信息cb
: 结构体大小,通常设为sizeof(PROCESS_MEMORY_COUNTERS)
返回参数意义如下所示:
- 成功:返回
TRUE
(非零值) - 失败:返回
FALSE
(零值),需调用GetLastError()
获取错误码
其中需要注意的是 PROCESS_MEMORY_COUNTERS
结构体,其包含如下所示的成员参数:
typedef struct _PROCESS_MEMORY_COUNTERS {DWORD cb; // 结构体大小DWORD PageFaultCount; // 页面错误次数SIZE_T PeakWorkingSetSize; // 工作集峰值(物理内存)SIZE_T WorkingSetSize; // 当前工作集大小SIZE_T QuotaPeakPagedPoolUsage; // 分页池配额峰值SIZE_T QuotaPagedPoolUsage; // 当前分页池配额SIZE_T QuotaPeakNonPagedPoolUsage; // 非分页池配额峰值SIZE_T QuotaNonPagedPoolUsage; // 当前非分页池配额SIZE_T PagefileUsage; // 页面文件使用量SIZE_T PeakPagefileUsage; // 页面文件使用峰值
} PROCESS_MEMORY_COUNTERS;
更详细的解释在官方网站:getProcessMemoryInfo 函数 (psapi.h) - Win32 apps | Microsoft Learn
如若链接点击无法跳转,可自行复制打开:
- https://learn.microsoft.com/zh-cn/windows/win32/api/psapi/nf-psapi-getprocessmemoryinfo
通过上述三个步骤即可轻松获取当前运行程序的 CPU
使用率及内存大小。
三、具体实现
在 Qt
中推荐在线程中计算获取这些信息。因为我们计算方法每 1s 获取一次时间,计算与前 1s 时间的差值得到 CPU
占用率。如果不适用线程,将会阻塞主线程的执行。
这里我给出示例:
-
cpumontior.h
#ifndef CPUMONTIOR_H #define CPUMONTIOR_H#include "windows.h" #include <QObject> #include <QThread> #include "psapi.h" #include <QtMath>class CpuMontior : public QThread {Q_OBJECT public:explicit CpuMontior(DWORD pid, QObject *parent = nullptr);void setDec(int dec) {this->dec = dec;}protected:void run() override;private:DWORD pid;int dec;// 封装转换函数static ULONGLONG filetimeToULONGLONG(const FILETIME *ft) {ULARGE_INTEGER uli;uli.LowPart = ft->dwLowDateTime;uli.HighPart = ft->dwHighDateTime;return uli.QuadPart;}// bytes 单位转换QString changeFileSize(qint64 fileSize){QStringList units;units << "B" << "KB" << "MB" << "GB" << "TB" << "PB";double mod = 1024.0;double size = fileSize;//qDebug() << size;int i = 0;long rest = 0;while (size >= mod && i < units.count()-1 ){rest= static_cast<long>(size) % static_cast<long>(mod);size /= mod;i++;}QString szResult = QString::number(qFloor(size));if( rest > 0){szResult += QString(".") + QString::number(rest).left(this->dec);}szResult += units[i];return szResult;}signals:/* 使用率信息 */void usageInfoSignal(QString cpuUsage, QString memUsage);public slots: };#endif // CPUMONTIOR_H
-
cpumontior.cpp
#include "cpumontior.h" #ifdef QT_DEBUG #include <QDebug> #endif/*!* @File : cpumontior.cpp* @Brief : 构造函数* @Details : None* @Param : void* @Return : void* @Author : Liu Jiahao* @Date : 2025-03-28 14:18:10* @Version : v1.1* @Copyright : Copyright By Liu Jiahao, All Rights Reserved**/ CpuMontior::CpuMontior(DWORD pid, QObject *parent) :QThread(parent), pid(pid), dec(2) {}/*!* @File : cpumontior.cpp* @Brief : 工作函数* @Details : None* @Param : void* @Return : void* @Author : Liu Jiahao* @Date : 2025-03-28 14:19:12* @Version : v1.1* @Copyright : Copyright By Liu Jiahao, All Rights Reserved**/ void CpuMontior::run() {// 获取系统资源信息HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, pid);if (!hProcess) return;FILETIME creationTime, exitTime, kernelTime, userTime;while (!isInterruptionRequested()) {// 第一次采样if (!GetProcessTimes(hProcess, &creationTime, &exitTime, &kernelTime, &userTime)) {break;}ULONGLONG kernel1 = filetimeToULONGLONG(&kernelTime);ULONGLONG user1 = filetimeToULONGLONG(&userTime);msleep(1000); // 每秒更新一次// 第二次采样if (!GetProcessTimes(hProcess, &creationTime, &exitTime, &kernelTime, &userTime)) {break;}ULONGLONG kernel2 = filetimeToULONGLONG(&kernelTime);ULONGLONG user2 = filetimeToULONGLONG(&userTime);// 计算差值ULONGLONG totalTime = (kernel2 - kernel1) + (user2 - user1);double cpuUsage = (totalTime / 10000.0) / 100.0; // 转换为百分比// 内存使用率PROCESS_MEMORY_COUNTERS pmc;qint64 memoryUsage = 0;if (GetProcessMemoryInfo(hProcess, &pmc, sizeof(pmc))) {memoryUsage = static_cast<qint64>(pmc.WorkingSetSize); // 单位:字节}// 通过信号发送emit usageInfoSignal(QString::number(cpuUsage, 'f', this->dec) + "%", changeFileSize(memoryUsage));} #ifdef QT_DEBUGqDebug() << "quit thread"; #endifCloseHandle(hProcess); }
增加 UI
进行显示后,效果如下所示:
可以说,跟我开头放的那个图区别不大。具体的 UI
设计这里不进行赘述,大家可以自行构建。我在函数中使用了 emit usageInfoSignal(QString::number(cpuUsage, 'f', this->dec) + "%", changeFileSize(memoryUsage));
发送信号,大家可以根据这个信号 connect
槽函数进行实现。
五、写在最后
本文介绍了 如何使用 Qt
获取当前软件的 CPU
使用率及内存大小。
题外话,现在觉得
AI
已经可以解决大部分遇到的问题,本文代码部分也借助了AI
帮助,所有功能并非我原创。其实我也很惋惜,大家可以自行通过AI
解决这些问题,就不需要在网上到处搜索,那我写博文似乎也失去了意义… 人工智能的发展不是坏事,只是改变了一些我们思考问题、解决问题的习惯。同时我也并不觉得 csdn 这个平台有多好,也未经过我同意擅自将我的文章设置为仅VIP可见,这与我初心相悖。随着工作繁忙,也很少有时间继续写下去…渐渐地也没有了动力。下次更新不知道是什么时候,希望读者海涵!
欢迎广大读者提出问题以及修改意见,本人看到后会给予回应,欢迎留言,后续会逐步进行开源!!!
另外,由于文章是作者手打的文字,有些地方可能文字会出错,望谅解,也可私信联系我,我对其进行更改。
-
个人CSDN账号:刘梓谦_-CSDN博客
-
Gitee:刘佳豪 (liu-jiahaohappy) - Gitee.com
-
GitHub:Jiahao-Liu29 (github.com)
相关文章:
Qt获取CPU使用率及内存占用大小
Qt 获取 CPU 使用率及内存占用大小 文章目录 Qt 获取 CPU 使用率及内存占用大小一、简介二、关键函数2.1 获取当前运行程序pid2.2 通过pid获取运行时间2.3 通过pid获取内存大小 三、具体实现五、写在最后 一、简介 近期在使用软件的过程中发现一个有意思的东西。如下所示&a…...
算法解密:除自身以外数组的乘积问题详解
算法解密:除自身以外数组的乘积问题详解 一、引言 在算法的奇妙旅程中,我们时常会遇到一些看似简单却蕴含深刻智慧的问题,“除自身以外数组的乘积”就是其中之一。这个问题不仅考验我们对数组操作的熟练程度,还要求我们在特定的限制条件下(不能使用除法且时间复杂度为O(n…...
基于Kubernetes的Apache Pulsar云原生架构解析与集群部署指南(上)
#作者:闫乾苓 文章目录 概念和架构概述主要特点消息传递核心概念Pulsar 的消息模型Pulsar 的消息存储与分发Pulsar 的高级特性架构BrokerBookKeeperZooKeeper 概念和架构 概述 Pulsar 是一个多租户、高性能的服务器到服务器消息传递解决方案。Pulsar 最初由雅虎开…...
信创生态核心技术栈:数据库与中间件
🧑 博主简介:CSDN博客专家、CSDN平台优质创作者,高级开发工程师,数学专业,10年以上C/C, C#, Java等多种编程语言开发经验,拥有高级工程师证书;擅长C/C、C#等开发语言,熟悉Java常用开…...
CMU-15445(3)——PROJECT#1-BufferPoolManager-Task#1
PROJECT#1-BufferPoolManager 在完成了前面基础的PROJECT#0后,从本节开始才正式进入了CMU-15445的学习,最终目的是构建一个面向磁盘的数据库管理系统。 PROJECT#1 的主要任务是实现数据库管理系统的缓冲池管理器,缓冲池负责在主存缓冲区与持…...
《数据结构初阶》【链式二叉树】
《数据结构初阶》【链式二叉树】 前言:---------------树---------------什么是树?📌爱心❤小贴士:树与非树?树的基本术语有哪些?关于节点的一些定义:关于树的一些定义:关于森林的定…...
Oracle免费认证来袭
1、Oracle Cloud Infrastructure 2025 Foundations Associate” 🔗 考证地址:https://mylearn.oracle.com/ou/exam-unproctored/oracle-cloud-infrastructure-2025-foundations-associate-1z0-1085-25/148056/241954 2、Oracle Cloud Infrastructure 2…...
Vim 编辑器常用快捷键速查表
Vim 编辑器常用快捷键速查表 Vim 快捷键大全 **1. 基础操作****2. 光标移动****3. 编辑文本****4. 查找替换****5. 分屏操作****6. 可视化模式** **附:Vim 模式切换流程图** 1. 基础操作 快捷键功能说明i进入插入模式(光标前)a进入插入模式&…...
从父类到子类:C++ 继承的奇妙旅程(1)
前言: 在前文,小编讲述了C模板的进阶内容,下面我们就要结束C初阶的旅行,开始进入C进阶容的旅c程,今天旅程的第一站就是C三大特性之一——继承的旅程,各位扶好扶手,开始我们今天的C继承的奇妙旅程…...
HTML9:页面结构分析
页面结构分析 元素名描述header标题头部区域的内容(用于页面或页面中的一块区域)footer标记脚部区域的内容(用于整个页面或页面的一块区域)sectionWeb页面的一块独立区域article独立的文章内容aside相关的内容或应用(…...
LabVIEW超声波液位计检定
在工业生产、运输和存储等环节,液位计的应用十分广泛,其中超声波液位计作为非接触式液位测量设备备受青睐。然而,传统立式水槽式液位计检定装置存在受建筑高度影响、量程范围受限、流程耗时长等问题,无法满足大量程超声波液位计的…...
maven 安装 本地 jar
命令: mvn install:install-file -DgroupIdnet.pingfang.application -DartifactIdjna -Dversion5.1.0 -Dpackagingjar -DfileD:\maven\repository1\jna\5.1.0\jna-5.1.0.jarmvn:这是Maven的执行命令。 install:install-file:这是Maven插件目…...
leetcode 141. Linked List Cycle
题目描述: 代码: 用哈希表也可以解决,但真正考察的是用快慢指针法。 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode(int x) : val(x), next(NULL) {}* };*/ class Soluti…...
【Python】通过`Editable Install`模式详解,解决Python开发总是import出错的问题
摘要 田辛老师在很久以前,写过一篇关于Python的模块、包之间的内部关系的博客,叫做【Python】__init__.py 文件详解。 虽然我觉得这篇文章已经足够了, 但是还是有很多朋友碰到开发的过程中import包报错的问题。 今天, 田辛老师想…...
C 语言网络编程问题:E1696 无法打开 源 文件 “sys/socket.h“
#include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h>在 C 语言网络编程中,上述代码报如下错误 E1696 无法打开 源 文件 "sys/socket.h"E1696 无法打开 源 文件 "netinet/in.h" E1696 无法打开 源 文件…...
操作指南*
任务1: 环境搭建 1.1 创建Spring Boot项目 操作步骤: 使用IDEA创建项目: 打开IDEA → File → New → Project选择 Spring Initializr → 设置项目信息(Group、Artifact、Java版本)选择依赖:Spring Web、MySQL Drive…...
VRM Add-on for Blender 学习笔记
VRM Add-on for Blender 使用教程-CSDN博客 VRM Add-on for Blender 是 Blender 的一个官方插件,主要用于 导入和导出 VRM 格式的 3D 模型。VRM(Virtual Reality Model)是一种开放标准的 3D 人形角色模型格式,起源于日本…...
C++ 完美转发
C 完美转发逐步详解 1. 问题背景与核心目标 在 C 模板编程中,若直接将参数传递给其他函数,参数的 值类别(左值/右值)和 类型信息(如 const)可能会丢失。例如: template<typename T> voi…...
学习记录:DAY23
项目开发与学习记录:字段注入优化 前言 我总有一种什么大的要来了的危机感。还是尽快把项目做起来吧,现在全在弄底层的框架。这是一个两天的blog,前一天bug没修好,气到连blog都没写。 日程 5月7日 晚上7点:本来想玩…...
Linux 信号(下篇)
Linux 信号-CSDN博客(上篇) 前言:在我上一篇博客写到了信号产生的三种条件分别是键盘组合键、kill命令、系统调用接口; 接下来我要把信号产生剩余的两个条件介绍完毕并理解信号的保存,和信号从产生到保存到处理整个过…...
hadoop中的序列化和反序列化(1)
1. 什么是序列化和反序列化 序列化(Serialization) 是将对象的状态信息转换为可以存储或传输的格式的过程。序列化后的对象可以保存到文件中,或者通过网络传输。 反序列化(Deserialization) 是序列化的逆过程&#x…...
linux查java进程CPU高的原因
问题:linux查java进程CPU高的原因 解决:用jdk带的工具分析 被查的java最好也使用jdk启动 systemctl启动的注意要去掉PrivateTmptrue /opt/jdk1.8.0_441/bin/jps -l top -Hp 8156 printf "%x" 8533 /opt/jdk1.8.0_441/bin/jstack 8156 |…...
鸿蒙开发——3.ArkTS声明式开发:构建第一个ArkTS应用
鸿蒙开发——3.ArkTS声明式开发:构建第一个ArkTS应用 一、创建ArkTS工程二、ArkTS工程目录结构(Stage模型)三、构建第一个页面四、构建第二个页面五、实现页面之间的跳转六、模拟器运行 一、创建ArkTS工程 1、若首次打开DevEco Studio,请点击…...
vue3+ts的watch全解!
vue3中的watch只能监听以下四种数据: 1.ref定义的数据 2.reactive定义的数据 3.函数返回一个值(getter函数) 4.一个包含上述内容的数组 通常我们在使用watch的时候,通常会遇到以下几种情况: 情况一: …...
yarn的概述
1.Yarn的定义 2.Yarn的三大组件 3.Yarn的调度策略 1. YARN的定义 YARN(Yet Another Resource Negotiator) 是Hadoop生态系统中的一个资源管理框架,用于管理和调度集群中的计算资源。它允许多个应用程序在同一个集群上高效地运行,…...
C++初阶-string类4
目录 1.String operations 1.1string::c_str 1.2string::data 1.3string::copy 1.4string::find 1.5string::rfind 1.6string::find_first_of 1.7string::find_last_of 1.8string::find_first_not_of和string::find_last_not_of find_first_not_of 功能 典型用途 f…...
HarmonyOS NEXT深度解析:自研框架ArkUI-X的技术革命与跨平台实践
HarmonyOS NEXT~深度解析:自研框架ArkUI-X的技术革命与跨平台实践 引言:ArkUI-X的诞生背景与战略意义 在HarmonyOS NEXT全面摒弃AOSP代码的历史性转折点上,华为推出的ArkUI-X框架标志着国产操作系统研发进入深水区。根据华为202…...
CUDA:out of memory的解决方法(实测有效)
一、问题概述 1.问题分析 CUDA out of memory问题通常发生在深度学习训练过程中,当GPU的显存不足以容纳模型、输入数据以及中间计算结果时就会触发。这个问题可能由几个因素引起: 模型和数据规模:深度学习模型尤其是大型模…...
canal mysqltomysql增加同步的库操作
例如增加库 online 1、停止canal.adapter 服务。 ./bin/stop.sh2、备份数据库online,导入目标mysql 备份 mysqldump -h 127.0.0.1 -P 3307 --single-transaction -uroot -p -B online > online.sql导入 mysql -h 127.0.0.1 -P 3308 -uroot -p < onl…...
【AI】模型与权重的基本概念
在 ModelScope 平台上,「模型」和「权重」的定义与工程实践紧密结合,理解它们的区别需要从实际的文件结构和加载逻辑入手。以下是一个典型 ModelScope 模型仓库的组成及其概念解析: 1. ModelScope 模型仓库的典型结构 以 deepseek-ai/deepse…...
k8s 中 deployment 管理的多个 pod 构成集群吗
在 Kubernetes (k8s) 中,通过 Deployment 创建的多个 Pod 本身并不构成一个“集群”,而是属于同一个 工作负载(Workload) 的多个副本实例。它们的角色是 无状态服务副本,而非独立的集群节点。以下是详细解释࿱…...
「动态规划」线性DP:股票问题合集 / LeetCode 121|122|123|188 (C++)
目录 概述 Question1 思路 算法过程 Code 复杂度 Question2 思路 解题过程 Code 复杂度 Question3 思路 解题过程 Code 复杂度 Question4 思路 解题过程 Code 复杂度 总结 概述 我们已经了解过了线性DP: 「动态规划」线性DP:最长…...
【Python os模块完全指南】从基础到高效文件操作
目录 🌟 前言🧩 技术背景与价值🚧 当前技术痛点🛠️ 解决方案概述👥 目标读者说明 📚 一、技术原理剖析🎨 核心概念图解💡 核心作用讲解🔑 关键技术模块说明⚖️ 技术选型…...
Ubuntu 安装 Keepalived、LVS
Keepalived Keepalived 是什么(高可用) Keepalived 是一个用于实现 高可用 性(High Availability, HA)的服务,是一款基于 VRRP 协议的高可用软件,常用于主备切换和虚拟IP漂移,在服务故障时自动…...
记录一个rabbitmq因为linux主机名服务无法启动的问题
https://g.co/gemini/share/fb5a55644f6f 过程因为主机名为数字导致之间无法进行网络访问,导致无法开启。修改主机名解决这一问题,debian在系统安装时会指定一个用户名,一般为IP地址的第一块,数字导致了无法访问。 #使用命令查看…...
打造个人知识库,wsl+ollama部署deepseek与vscode集成
目前大模型应用如火如荼,各大LLM如Deepseek也都提供了在线的助手服务,结合mcp-server还可以进一步拓展到本地的工具能力。 但对于一些和本地业务和数据强相关的资料,在线的大模型训练数据集一般并不能涵盖,特别还有一些敏感或对安全要求很高的数据,使用在线大模型并不现实…...
Spring 项目无法连接 MySQL:Nacos 配置误区排查与解决
在开发过程中,我们使用 Nacos 来管理 Spring Boot 项目的配置,其中包括数据库连接配置。然而,在实际操作中,由于一些概念的混淆,我们遇到了一些连接问题。本文将分享我的故障排查过程,帮助大家避免类似的错…...
P值、置信度与置信区间的关系:统计推断的三大支柱
目录 引言一、P值是什么?——假设检验的“证据强度”1.1 定义1.2 判断标准:显著性水平 α \alpha α(阿尔法)1.3 示例说明 二、置信区间与置信度:参数估计的“不确定性范围”2.1 置信区间的定义2.2 置信度的含义 三、显…...
探索智能仓颉:Cangjie Magic开发体验
探索智能仓颉:Cangjie Magic 的开发体验与技术革新 在大型语言模型(LLM)驱动的智能体开发领域,2025年3月开源的 Cangjie Magic 以其独特的原生仓颉语言基因和三大核心技术突破,为开发者提供了一种全新的开发范式。本文将从技术架构、实际应用、开发体验及未来潜力等角度,…...
$在R语言中的作用
在 R 语言中,$ 是一个非常重要的操作符,主要用于访问对象的成员或组件。它的用途非常广泛,不仅限于数据框(data frame),还可以用于列表(list)、环境(environment…...
【Pandas】pandas DataFrame rolling
Pandas2.2 DataFrame Function application, GroupBy & window 方法描述DataFrame.apply(func[, axis, raw, …])用于沿 DataFrame 的轴(行或列)应用一个函数DataFrame.map(func[, na_action])用于对 DataFrame 的每个元素应用一个函数DataFrame.a…...
新疆地区主要灾害链总结
新疆地处亚欧大陆腹地,拥有高山(如天山、昆仑山)、盆地(如塔里木盆地、准噶尔盆地)、沙漠(如塔克拉玛干沙漠)、绿洲、内陆河流和冰川等复杂多样的地貌单元。其气候极端,干旱少雨是常态,但山区夏季暴雨集中、冬季积雪深厚,地质构造活跃,地震风险高。这些特点共同决定…...
在 Vue 2 中使用 qrcode 库生成二维码
🌟 前言 欢迎来到我的技术小宇宙!🌌 这里不仅是我记录技术点滴的后花园,也是我分享学习心得和项目经验的乐园。📚 无论你是技术小白还是资深大牛,这里总有一些内容能触动你的好奇心。🔍 &#x…...
在 Ubuntu 系统中,挂起(Suspend)和休眠(Hibernate)
在 Ubuntu 系统中,挂起(Suspend)和休眠(Hibernate)是两种常见的电源管理模式。以下是相关命令及说明: --- ### **1. 挂起(Suspend)** 挂起会将当前系统状态保存到内存中࿰…...
什么是声明式UI什么是命令式UI?鸿蒙ArkTS为什么是声明式UI-优雅草卓伊凡
什么是声明式UI什么是命令式UI?鸿蒙ArkTS为什么是声明式UI-优雅草卓伊凡 一、UI编程范式的根本分野 在软件开发领域,用户界面(UI)构建方式经历了三次重大范式转换。作为优雅草科技CTO,卓伊凡在多个操作系统开发实践中发现,UI框架…...
nRF Connect SDK system off模式介绍
目录 概述 1. 软硬件环境 1.1 软件开发环境 1.2 硬件环境 2 System Off 模式 2.1 模式介绍 2.2 注意事项 3 功能实现 3.1 框架结构介绍 3.2 代码介绍 4 功能验证 4.1 编译和下载代码 4.2 测试 4.3 使能CONFIG_APP_USE_RETAINED_MEM的测试 5 main.c的源代码文件…...
node.js 实战——餐厅静态主页编写(express+node+ejs+bootstrap)
ejs页面 <!DOCTYPE html> <html> <head><title><% title %></title><link relstylesheet href/stylesheets/style.css/><link relstylesheet href/stylesheets/font-awesome.css/><link relstylesheet href/stylesheets/f…...
晶体布局布线
1Clock时钟电路 时钟电路就是类似像时钟一样准确运动的震荡电路,任何工作都是依照时间顺序,那么产生这个时间的电路就是时钟电路,时钟电路一般是由晶体振荡器、晶振、控制芯片以及匹配电容组成 2.时钟电路布局 晶体电路布局需要优先考虑&…...
数据结构--树
一、树的概念 树是由n(n≥0)个节点组成的有限集合,它满足以下条件: 1. 当n0时,称为空树 2. 当n>0时,有且仅有一个特定的节点称为根节点(root) 3. 其余节点可分为m(m≥0)个互不相交的有限集合,每个集合本身又是一…...
5月7号.
flex布局: 表单标签: 表单标签-表单项:...