当前位置: 首页 > news >正文

【Linux我做主】进度条小程序深度解析

Linux下C语言进度条程序深度解析

  • 进度条小程序
    • GitHub地址
  • 前言
  • 前置知识
    • 回车换行(CR/LF)的深度解析
      • 历史渊源与技术规范
      • 在进度条/倒计时中的应用
    • 缓冲区机制的全面剖析
      • 缓冲区引入
      • 缓冲类型对比
      • 进度条开发中的关键控制
  • 进度条实现
    • 以小见大——倒计时
      • 倒计时最终效果演示
      • 错误演示
        • 位宽不够带来的影响
        • 设置位宽后不反转带来的影响
        • 不使用\r回车带来的影响
      • 总结回顾倒计时
    • 进度条架构设计
      • 组件关系图
      • 核心数据结构
    • 版本迭代解析
      • v1版本悟原理
        • progressBar.h头文件
        • progressBar.c源文件
        • main.c调用
      • V2版本求拓展
        • progressBar.h头文件
        • progressBar.c源文件
        • main.c模拟多任务调度实现
        • 最终效果演示
    • Makefile配置要点
  • 结语

进度条小程序

GitHub地址

有梦想的电信狗

前言

​ 在Linux系统编程中,控制台交互的视觉反馈是提升用户体验的重要环节。进度条作为经典的人机交互组件,在软件安装、文件传输、数据处理等场景中具有广泛应用价值。本文将以Linux环境下C语言实现的进度条程序为切入点,深入探讨控制台输出控制、缓冲区机制、函数指针应用等核心技术。通过三个版本迭代的代码解析(基础版/V1、模拟多任务版/V2),读者将掌握从原理到实践的完整知识链路。


前置知识

回车换行(CR/LF)的深度解析

在C语言中,我们使用\n来表示换行,这其实是C语言帮我们做了处理。实际上,回车和换行其实是两个动作。

C语言中用\n来表示回车和换行。
在这里插入图片描述

以上图片深入阐述了回车和换行概念以及和区别。

  • \r:回车,光标回到当前行的最开始。C语言中用\r来表示仅回车。
  • \n:换行,光标垂直向下移动一行,叫做换行。

历史渊源与技术规范

  • ASCII规范定义:CR(Carriage Return,\rASCII 13)将光标移动到行首
  • LF(Line Feed,\nASCII 10)使光标下移一行
  • Windows系统采用CRLF组合实现新行操作
  • Linux/Unix系统使用LF单独完成换行

在进度条/倒计时中的应用

printf("%-3d\r", cnt);  // 关键代码示例

此代码实现:

  1. 使用%-3d保证3字符宽度左对齐
    • 3表示该值位宽为3,C语言默认为右对齐,用-来表示左对齐。
  2. \r使每次输出回到行首
  3. 配合fflush(stdout)强制刷新缓冲区
  4. 实现原地更新的数字倒计时效果

缓冲区机制的全面剖析

缓冲区引入

先看如下两个例子:

  • 有换行符\n时显示器直接刷新
    在这里插入图片描述
  • 无换行符时,像是先执行了sleep再执行printf
    在这里插入图片描述
    经分析得知:
  • C语言中一定是按顺序执行代码的,因此一定是printf先执行,再执行sleep
  • 那么,在sleep期间,printf函数一定已经执行完了。
  • 那么,sleep期间,hello wolrd在哪里?

综上,hello wolrd一定是被保存起来了!!!

保存hello wolrd,必然 需要一块内存空间,这块内存空间被称为缓冲区

  • 缓冲区就是由C语言维护的一段内存。

C程序运行时,默认会帮助我们打开三个输入输出流

  • stdin:标准输入
  • stdout:标准输出(默认是显示器)
  • stderr:标准错误

C语言的默认行为是在程序退出时,再刷新缓冲区。

printf打印消息,是向stdout输入,消息暂存在了stdout中,当我们不想让消息暂存在缓冲区中,而是想直接刷新stdout的内容到显示器时,可以使用fflush刷新,默认stdout在程序结束时刷新,使用fflush可以强制进行刷新输入输出流

在这里插入图片描述

  • 以下:
  • 此时printf("hello world")没有\n
  • 使用fflush(stdout)强制将缓冲区中的数据刷新到显示器上

在这里插入图片描述

通过以上两个例子,我们已经对缓冲区有了一个大概的理解了。

缓冲类型对比

缓冲类型特征典型应用场景
全缓冲缓冲区满时刷新文件操作
行缓冲遇到换行符或缓冲区满时刷新终端输出(默认)
无缓冲立即输出标准错误流stderr

进度条开发中的关键控制

  • 手动刷新机制:
fflush(stdout);  // 强制立即输出缓冲区内容

进度条实现

以小见大——倒计时

倒计时最终效果演示

在这里插入图片描述

  • 代码如下:
void test() {//实现一个倒计时int cnt = 100;while (cnt >= 0) {// printf("%-2d\r", cnt);//使用\r回车会导致三位数只刷新了两位数printf("%-3d\r", cnt);  // %3d\r 可以实现在行的开头更新数字  -相当于反转  确保是左对齐fflush(stdout);--cnt;sleep(1);}printf("\n");
}
int main() {test();return 0;
}
  • 当前设置倒计时从100开始
  • 关于printf中的参数%-3d\r的解释
    • %d的作用:表示输出数字cnt,用于显示倒计时
    • 3的作用:用于控制输出显示位宽为3,倒计时的数字是几位,位宽就设置为几。
    • -的作用:设置位宽后,C程序默认为右对齐,我们想让数字在当前行的最左侧显示,要用-实现左对齐。
    • \r的作用:用于实现仅回车,回到当前行的开始,覆盖打印实现倒计时的效果。
  • 使用fflush(stdout)将缓冲区内的数据立即刷新出来
  • sleep(1)每隔一秒循环一次

错误演示

位宽不够带来的影响

在这里插入图片描述

  • 位宽小于数字的位数时,会出现数字残余的情况。
  • 由于显示器是字符设备,只会一个一个打印字符,123实际上是1 2 3三个字符连在一起表示的
  • 以下是从10开始计数的错误例子

在这里插入图片描述

  • 正确设置位宽即可解决
设置位宽后不反转带来的影响

在这里插入图片描述

  • 不用-进行反转会导致数字不靠左显示
    • 对于倒计时来说影响甚微,但靠右显示的话,会导致进度条从右向左加载!
不使用\r回车带来的影响

在这里插入图片描述

  • 不使用\r会导致数字接连不断的出现,不符合倒计时的效果。

总结回顾倒计时

printf中的格式化控制参数缺一不可

  • 关于printf中的参数%-3d\r的理解
    • %d表示输出数字cnt,用于显示倒计时
    • 3用于控制输出显示位宽为3,倒计时的数字是几位,位宽就设置为几。
    • 设置位宽后,C程序默认为右对齐,我们想让数字在当前行的最左侧显示,要用-实现左对齐。
    • \r用于实现仅回车,回到当前行的开始,覆盖打印实现倒计时的效果。
  • 使用fflush(stdout)将缓冲区内的数据立即刷新出来

进度条架构设计

组件关系图

main函数
模拟downLoad
progressbar回调
initBar初始化
bar数组操作

核心数据结构

#define NUM 102       // 缓冲区长度(含终止符)
#define BODY '='      // 进度条主体字符
#define HEAD '>'      // 进度头部指示符
#define TOP 100       // 进度最大值typedef void (*callback_t)(int);  // 标准化回调接口 
  • 利用函数指针实现回调。

版本迭代解析

v1版本悟原理

progressBar.h头文件
#pragma once#include <stdio.h>//缓冲区长度(含终止符)
#define NUM 102  	  // 102 表示字符数组的长度 0-100 101个字符  末尾是\0, 因此大小是 102
#define BODY '='      // 进度条主体字符
#define HEAD '>'      // 进度头部指示符
#define TOP 100       // 进度最大值extern void progressbar(int speed);  // extern 声明外部变量时必须加上  函数声明可加可不加
  • #pragma once:防止头文件重复包含
  • #define NUM 102102 表示字符数组的长度,0-100,共101个字符 ,字符串末尾是\0, 因此数组长度是102
  • #define BODY '=':定义进度条的形体为=
  • #define HEAD '>':定义进度条的头部为>
  • #define TOP 100:定义进度条的区间长度,暂定为100

通过宏的方式定义,可以方便的实现进度条样式的修改!

progressBar.c源文件
#include "progressBar.h"
#include <string.h>
#include <unistd.h>char bar[NUM] = {0};
const char* label = "|/-\\";void progressbar(int speed) {memset(bar, '\0', sizeof(bar));  //整体将字符串设为\0,可以方便的输出int len = strlen(label);int cnt = 0;while (cnt <= TOP) {//没有\n 就没有立即刷新,因为显示器默认是行刷新printf("[%-100s][%d%%][%c]\r", bar, cnt, label[cnt % len]);//预留出100空间,100s 默认是右对齐,进度条是反的, 用-100s解决//用变长的字符串,循环覆盖输出,实现进度条光标移动的效果//给进度条跑  %%显示百分号fflush(stdout);bar[cnt++] = BODY;  //更改进度条的风格if (cnt < TOP)bar[cnt] = '>';// sleep(1);usleep(speed);  // 100000微秒,用usleep实现更快的跑完}printf("\n");  //防止命令行提示符影响效果
}
  • char bar[NUM] = {0}:进度条主体使用长度不断改变的字符串来实现
    • 初始化为{0},这样就不用手动设置\0终止符了,用%s输出变化的字符串
    • 0-100,恰好是char bar[NUM] = {0}字符数组中每个字符的下标
    • 每次循环内
      • cnt会++
      • 利用cnt0-100每个位置的字符都设置为进度条主体=
      • 随着cnt++,数组内字符串的长度也在增长,再通过%s\r回车数组字符串,从而实现进度条的动态增长
  • const char* label = "|/-\\"
    • 通过0-4五个字符的顺序循环输出,实现光标闪动的效果。
  • printf("[%-100s][%d%%][%c]\r", bar, cnt, label[cnt % len])
    • [%-100s]
      • -:确保进度条不反方向增长
      • 100s:预留出100长度,供进度条字符串填充
    • [%d%%]
      • %d:输出进度数字cnt
      • %%:控制输出字符%
    • [%c]:控制循环顺序输出|/-\\中的每个字符,实现光标闪动的效果
      • cnt % len实现0-4的循环
    • \r:实现每次从行首开始输出,实现进度条的动态增长!
  • fflush(stdout):每次printf过后,刷新缓冲区
  • usleep(speed)usleep结合函数参数speed,实现进度条时长的控制
main.c调用
#include <unistd.h>
#include "progressBar.h"int main(){progressbar(20000);return 0;
}

效果如下
在这里插入图片描述

V2版本求拓展

  • 进度条最常见的适用场景就是在下载任务中,具体的运行方式应该是:
    • 下载任务向进度条函数传递下载任务已完成的进度百分比,进度条函数根据比率动态显示
    • 因此下载任务内一定要反复调用进度条程序。
  • 我们可以传入进度条函数的地址进行实现,也就是函数指针的回调函数
progressBar.h头文件
#pragma once#include <stdio.h>//缓冲区长度(含终止符)
#define NUM 102  	  // 102 表示字符数组的长度 0-100 101个字符  末尾是\0, 因此大小是 102
#define BODY '='      // 进度条主体字符
#define HEAD '>'      // 进度头部指示符
#define TOP 100       // 进度最大值typedef void (*callback_t)(int);  //函数指针类型extern void progressbar(int rate);  // extern 声明外部变量时必须加上  函数声明可加可不加
extern void downLoad(callback_t cb);
extern void initBar();
  • typedef void (*callback_t)(int)callback_t是函数指针类型,我们可以拆解帮助理解:
  • void (*)(int):其中:
    • * :表示这是一个指针,且必须用括号包裹。否则会被解析为函数返回指针(如 void *func(int) 是返回 void* 的函数)
    • (*):表示这是一个函数指针
      • void:表示该函数的返回值为void,
      • (int):表示该函数的参数类型为一个int
  • typedef void (*callback_t)(int)可以理解为typedef void (*)(int) callback_t
    • typedef:在typedef中,参数名会被省略,只保留类型。因此可以拆解为:
    • typedef void (*)(int) callback_t:将void (*)(int)类型的指针定义为类型别名 callback_t
progressBar.c源文件
#include "progressBar.h"
#include <string.h>
#include <unistd.h>
// v2 应用
char bar[NUM] = {0};
const char* label = "|/-\\";void initBar() {memset(bar, '\0', sizeof(bar));
}
void progressbar(int rate) {if (rate < 0 || rate > 100)return;int len = strlen(label);//用单个字符循环覆盖输出实现光标闪动printf("[%-100s][%d%%][%c]\r", bar, rate, label[rate % len]);fflush(stdout);bar[rate++] = BODY;  //更改进度条的风格if (rate < TOP)bar[rate] = HEAD;
}

优化亮点

  • 全局状态保存实现多任务支持

  • initBar()提供重置进度条的能力

  • 动态头部指示符(>)增强视觉效果

  • 增加非法进度的判断

    • if (rate < 0 || rate > 100) return
main.c模拟多任务调度实现
#include <unistd.h>
#include "progressBar.h"
// 模拟下载任务调用进度条
void downLoad(callback_t cb) {		int total = 1000;int curr = 0;  //目前curr需要从0开始while (curr <= total) {//进行某种下载任务,模拟时使用手动控制速度usleep(50000);int rate = curr * 100 / total;cb(rate);  	 // 传入参数,回调展示进度curr += 10;}printf("\n");  //防止命令行提示符影响效果
}int main() {printf("downLoan 1:\n");downLoad(progressbar);initBar();printf("downLoan 2:\n");downLoad(progressbar);initBar();printf("downLoan 3:\n");downLoad(progressbar);initBar();return 0;
}
  • 通过任务调用进度条,外部程序通过回调,调用进度条
  • void (callback_t)(int)callback_t是函数指针类型。
    • 相当于typedef void (*)(int) callback_t,把callback_t变成函数指针类型的别名

关键技术

  1. 函数指针实现回调机制
  2. 速率换算算法(curr * 100 / total
  3. 时间控制(usleep微秒级延时)
  4. char bar[NUM]为全局数组,每次模拟download后,需initbar()函数重置保证独立性
  5. 模块化设计,确保了可维护性。
最终效果演示

在这里插入图片描述

Makefile配置要点

# 依赖关系# 依赖方法
progressBar:*.c  @gcc $^ -o $@# clean和上面是独立的
.PHONY:clean   
clean:@rm -f progressBar

结语

关键知识点回顾

  1. 控制台输出控制回车符与换行符的灵活运用
  2. 缓冲区机制:行缓冲特性与强制刷新策略
  3. 可视化设计:进度条元素(主体、头部、百分比)的协同
  4. 软件工程实践模块化设计、回调机制、多任务支持

扩展应用场景

  1. 大数据处理进度监控
  2. 嵌入式系统固件更新
  3. 自动化测试进度反馈
  4. 游戏加载界面优化

​ 通过本文对Linux下C语言进度条程序的深度解析,我们系统性地掌握了控制台交互的核心技术。从回车换行符的底层原理缓冲区刷新机制,从进度条动态显示模块化设计,每一步都揭示了控制台可视化反馈的实现精髓。通过函数指针与回调机制的精妙配合,我们实现了多任务场景下的独立进度管理,展现了C语言在系统编程中的强大灵活性。

​ 本项目的核心价值在于:不仅实现了基础的进度展示功能,更通过版本迭代演进,示范了软件开发的渐进式优化思路。在性能层面,未来可结合纳秒级延时控制多线程安全机制提升精度;在交互层面,可考虑引入ANSI色彩代码或动态图标可进一步增强用户体验。

分享到此结束啦
一键三连,好运连连!

相关文章:

【Linux我做主】进度条小程序深度解析

Linux下C语言进度条程序深度解析 进度条小程序GitHub地址 前言前置知识回车换行&#xff08;CR/LF&#xff09;的深度解析历史渊源与技术规范在进度条/倒计时中的应用 缓冲区机制的全面剖析缓冲区引入缓冲类型对比进度条开发中的关键控制 进度条实现以小见大——倒计时倒计时最…...

Vue项目安全实践指南:从输入验证到状态管理的全方位防护

一、项目背景 在Vue2项目开发过程中&#xff0c;我们遇到了一些需要优化的安全实践问题。本文将分享我们在项目中的一些安全优化经验&#xff0c;希望能帮助到其他开发者。 主要优化点&#xff1a; 输入输出安全处理请求安全防护数据存储安全路由访问控制文件上传处理表单数…...

Pinocchio导入URDF关节为continuous的问题及详细解释

视频讲解&#xff1a; Pinocchio导入URDF关节为continuous的问题及详细解释 仓库地址&#xff1a;GitHub - LitchiCheng/mujoco-learning 问题背景&#xff1a;打算测试将之前的panda的urdf换成so-arm100的urdf&#xff0c;发现pinocchio的代码不能用&#xff0c;很奇怪&#…...

《Python星球日记》第30天:Flask数据库集成

名人说&#xff1a;路漫漫其修远兮&#xff0c;吾将上下而求索。—— 屈原《离骚》 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 专栏&#xff1a;《Python星球日记》&#xff0c;限时特价订阅中ing 目录 一、数据库…...

GAF-CNN-SSA-LSSVM故障诊断/分类预测,附带模型研究报告(Matlab)

GAF-CNN-SSA-LSSVM故障诊断/分类预测&#xff0c;附带模型研究报告&#xff08;Matlab&#xff09; 目录 GAF-CNN-SSA-LSSVM故障诊断/分类预测&#xff0c;附带模型研究报告&#xff08;Matlab&#xff09;效果一览基本描述程序设计参考资料 效果一览 基本描述 本研究提出的GA…...

轻松养生:让健康融入生活

养生不是负担&#xff0c;而是可以轻松融入日常的生活方式。掌握以下要点&#xff0c;就能开启健康之旅。 清晨醒来&#xff0c;先喝一杯常温水&#xff0c;唤醒沉睡的肠胃。早餐选择富含膳食纤维的燕麦片搭配新鲜水果&#xff0c;补充能量又促进消化。午餐和晚餐做到荤素搭配&…...

工业主义与民主的兴衰:历史逻辑与未来危机

一、工业主义催生大众民主的机制 经济基础变革 非技术工人崛起&#xff1a;工业革命后&#xff0c;机器生产替代传统手工业&#xff0c;非熟练工人&#xff08;包括妇女、儿童&#xff09;收入提升&#xff0c;财富分配趋于平等&#xff0c;形成新兴中产阶级。 政府财政能力增…...

从代码学习深度学习 - 目标检测前置知识(二) PyTorch版

文章目录 前言一、多尺度目标检测1.1 多尺度锚框1.2 绘图工具函数 (`utils_for_huitu.py`)1.3 可视化多尺度锚框1.4 多尺度检测(理论)二、自定义目标检测数据集2.1 读取数据2.2 创建 Dataset 类2.3 创建 DataLoader2.4 验证数据加载2.5 可视化数据集样本总结前言 大家好!欢…...

什么是“系统调用”

一、什么是“系统调用”&#xff1f;用生活中的比喻理解 可以把“系统调用”比作你&#xff08;用户&#xff09;向“管理员”请求帮助完成某件事情的过程。 举个例子&#xff1a; 你想借书&#xff0c;去图书馆&#xff08;操作系统&#xff09;找管理员&#xff08;内核&a…...

代码异味(Code Smell)识别与重构指南

1、引言:什么是“代码异味”? 在软件开发中,“代码异味(Code Smell)”是指那些虽然不会导致程序编译失败或运行错误,但暗示着潜在设计缺陷或可维护性问题的代码结构。它们是代码演进过程中的“信号灯”,提示我们某段代码可能需要优化。 1.1 ✅ 为什么关注代码异味? 预…...

005-nlohmann/json 基础方法-C++开源库108杰

《二、基础方法》&#xff1a;节点访问、值获取、显式 vs 隐式、异常处理、迭代器、类型检测、异常处理……一节课搞定C处理JSON数据85%的需求…… JSON 字段的简单类型包括&#xff1a;number、boolean、string 和 null&#xff08;即空值&#xff09;&#xff1b;复杂类型则有…...

java学习之数据结构:四、树(代码补充)

这部分主要是用代码实现有序二叉树、树遍历、删除节点 目录 1.构建有序二叉树 1.1原理 1.2插入实现 2.广度优先遍历--队列实现 3.深度优先遍历--递归实现 3.1先序遍历 3.2中序遍历 3.3后序遍历 4.删除 4.1删除叶子节点 4.2删除有一棵子树的节点 4.3删除有两棵子树的节…...

Java面试场景分析:从音视频到安全与风控的技术探讨

Java面试场景分析&#xff1a;从音视频到安全与风控的技术探讨 在一个阳光明媚的早晨&#xff0c;互联网大厂的面试室里&#xff0c;面试官李老师坐在桌前&#xff0c;严肃认真&#xff1b;而程序员小张则显得有些紧张&#xff0c;甚至有些搞笑。 第一轮提问&#xff1a; 李老…...

《OmniMeetProTrack 全维会议链智能追录系统 软件设计文档》

撰稿人&#xff1a;wjz 一、引言 1.1 目的 本软件设计文档详细描述了 OmniMeetProTrack 全维会议链智能追录系统的架构、组件、模块设计及实现细节&#xff0c;旨在为开发人员、利益相关者和维护人员提供系统的全面设计蓝图。本文档基于需求定义文档&#xff0c;确保系统实现…...

C 语言逻辑运算符:组合判断,构建更复杂的条件

各类资料学习下载合集 ​​https://pan.quark.cn/s/8c91ccb5a474​​ 在 C 语言编程中,我们已经学习了如何使用比较运算符(如 ​​==​​​, ​​<​​​, ​​>​​)来判断两个值之间的关系,从而得到“真”或“假”的结果。但很多时候,我们需要根据多个条件的组合…...

大模型推理框架简介

概述 通常需要大量的计算资源&#xff0c;高效运行LLMs仍然是一个挑战&#xff0c; 推理框架作为LLM高效部署的关键组件&#xff0c;直接关系到应用的性能、成本和开发效率。 高性能框架 vLLM GitHub&#xff0c;由SKYPILOT构建的推理优化框架&#xff0c;旨在提高在GPU上…...

《MATLAB实战训练营:从入门到工业级应用》高阶挑战篇-《5G通信速成:MATLAB毫米波信道建模仿真指南》

《MATLAB实战训练营&#xff1a;从入门到工业级应用》高阶挑战篇-5G通信速成&#xff1a;MATLAB毫米波信道建模仿真指南 &#x1f680;&#x1f4e1; 大家好&#xff01;今天我将带大家进入5G通信的奇妙世界&#xff0c;我们一起探索5G通信中最激动人心的部分之一——毫米波信…...

word导出pdf带有目录导航栏-error记

1、打开word文档——>点击"视图"选项卡——>勾选"导航窗格" 2、点击"文件"——>导出——>创建PDF/XPS 3、点击"选项"——>勾选"创建书签时使用(C)" "标题(H)" 4、点击"确定"——>点击…...

word怎么删除空白页?word最后一页删不掉怎么办

在使用word的过程中&#xff0c;有时出现空白页就可能会给大家带来一些困扰。到底怎么样才能把这些空白页删除&#xff0c;又应该如何解决最后也删不掉的问题呢&#xff1f; 要想删除普通的空白页&#xff0c;那就需要将光标直接放在空白页&#xff0c;然后按【Delete】键&…...

虚幻基础:硬件输入

文章目录 triggered&#xff1a;按下一直触发 等于tickcompleted&#xff1a;必须等到triggered结束后 才触发松下triggered结束 默认按键触发顺序按下&#xff1a;触发两个先 Started后 Triggered 松开Completed 触发器&#xff1a;用于修改triggered 触发和结束驱动阈值&…...

【Java ee初阶】多线程(5)

一、wait 和 notify wait notify 是两个用来协调线程执行顺序的关键字&#xff0c;用来避免“线程饿死”的情况。 wait 和 notify 其实都是 Object 这个类的方法&#xff0c;而 Object这个类是所有类的“祖宗类”&#xff0c;也就是说明&#xff0c;任何一个类&#xff0c;都…...

售前赢单评分是越权吗?

相关文章 软件实施工作个人看法 当前部门软件产品经理的职责涵盖售前支持工作。此前梳理工作时&#xff0c;计划在每个售前支持项目完成后&#xff0c;由支持人对项目赢单概率进行评估&#xff0c;旨在通过这一机制筛选重点项目&#xff0c;为赢单率高的项目优先配置资源。 …...

uniapp中用canvas绘制简单柱形图,小容量,不用插件——简单使用canvas

uniapp中用canvas绘制简单柱形图&#xff0c;小容量&#xff0c;不用插件——简单使用canvas 完整代码 <template><view><!-- 学习数据 --><!-- 头部选项卡 --><view class"navTab"><view :class"listIndexi?activite:"…...

SecureCRT 使用指南:安装、设置与高效操作

目录 一、SecureCRT 简介 1.1 什么是 SecureCRT&#xff1f; 1.2 核心功能亮点 1.3 软件特点 二、SecureCRT 安装与激活 2.1 安装步骤&#xff08;Windows 系统&#xff09; 2.2 激活与破解&#xff08;仅供学习参考&#xff09; 三、基础配置与优化 3.1 界面与编码设…...

WebRTC 服务器之SRS服务器概述和环境搭建

1.概述 SRS&#xff08;Simple Realtime Server&#xff09;是一款高性能、跨平台的流媒体服务器&#xff0c;支持多种协议&#xff0c;包括 RTMP、WebRTC、HLS、HTTP-FLV、SRT、MPEG-DASH 和 GB28181。本文介绍了 SRS&#xff0c;包括其用途、关键功能、架构和支持协议。SRS 旨…...

第R8周:RNN实现阿尔兹海默病诊断(pytorch)

- **&#x1f368; 本文为[&#x1f517;365天深度学习训练营](https://mp.weixin.qq.com/s/rnFa-IeY93EpjVu0yzzjkw) 中的学习记录博客** - **&#x1f356; 原作者&#xff1a;[K同学啊](https://mtyjkh.blog.csdn.net/)** 一&#xff1a;前期准备工作 1.设置硬件设备 impo…...

vue+element 导航 实现例子

项目使用的是 vue 3&#xff0c;安装配置可以查看栏目前面的文章。 组件 导航&#xff1a;https://element-plus.org/zh-CN/component/menu.html 面包屑&#xff1a;https://element-plus.org/zh-CN/component/breadcrumb.html 安装element库 PS D:\code\my-vue3-project&g…...

金仓数据库 KingbaseES 在电商平台数据库迁移与运维中深入复现剖析

金仓数据库 KingbaseES 在电商平台数据库迁移与运维中深入复现剖析 前言 在当今数字化商业蓬勃发展的时代&#xff0c;电商平台的数据量呈爆发式增长&#xff0c;对数据库性能、稳定性和扩展性提出了极高要求。本文章基于大型电商平台原本采用 MySQL 数据库&#xff0c;但随着业…...

Go小技巧易错点100例(三十)

本期分享&#xff1a; 1.切片共享底层数组 2.获取Go函数的注释 切片共享底层数组 在Go语言中&#xff0c;切片和数组是两种不同的元素&#xff0c;但是切片的底层是数组&#xff0c;并且还有一个比较重要的机制&#xff1a;切片共享底层数组。 下面这段代码演示了切片&…...

LeetCode 热题 100 78. 子集

LeetCode 热题 100 | 78. 子集 大家好&#xff0c;今天我们来解决一道经典的算法题——子集。这道题在 LeetCode 上被标记为中等难度&#xff0c;要求给定一个整数数组 nums&#xff0c;返回该数组所有可能的子集&#xff08;幂集&#xff09;。解集不能包含重复的子集&#x…...

苹果公司正在与亚马逊支持的初创公司Anthropic展开合作

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…...

Python项目源码57:数据格式转换工具1.0(csv+json+excel+sqlite3)

1.智能路径处理&#xff1a;自动识别并修正文件扩展名&#xff0c;根据转换类型自动建议目标路径&#xff0c;实时路径格式验证&#xff0c;自动补全缺失的文件扩展名。 2.增强型预览功能&#xff1a;使用pandastable库实现表格预览&#xff0c;第三方模块自己安装一下&#x…...

Redis总结(六)redis持久化

本文将简单介绍redis持久化的两种方式 redis提供了两种不同级别的持久化方式&#xff1a; RDB持久化方式能够在指定的时间间隔能对你的数据进行快照存储.AOF持久化方式记录每次对服务器写的操作,当服务器重启的时候会重新执行这些命令来恢复原始的数据,AOF命令以redis协议追加保…...

【PostgreSQL数据分析实战:从数据清洗到可视化全流程】5.3 相关性分析(PEARSON/SPEARMAN相关系数)

&#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 文章大纲 5.3 相关性分析&#xff08;PEARSON/SPEARMAN相关系数&#xff09;5.3.1 相关性分析理论基础5.3.1.1 相关系数定义与分类5.3.1.2 Pearson相关系数&#xff08; Pearson Corr…...

C++负载均衡远程调用学习之负载均衡算法与实现

目录 01 lars 系统架构回顾 02 lars-lbAgentV0.4-route_lb处理report业务流程 03 lars-lbAgentV0.4-负责均衡判断参数配置 04 lars-lbAgentV0.4-负载均衡idle节点的失败率判断 05 lars-lbAgentV0.4-负载均衡overload节点的成功率判断 06 lars-lbAgentV0.4-负载均衡上报提交…...

AIGC学术时代:DeepSeek如何助力实验与数值模拟

目录 1.实验和数值模拟工具 2.结合使用 大家好这里是AIWritePaper官方账号&#xff0c;官网&#x1f449;AIWritePaper~ 在工程和科学研究的世界里&#xff0c;实验与数值模拟是探索未知、验证理论和推动创新的两大支柱。它们如同一对翅膀&#xff0c;让思想得以飞翔&#xf…...

PHP数组排序深度解析:sort()、rsort()、asort()、arsort()、ksort()、krsort() 的适用场景与性能对比

在PHP开发中&#xff0c;数组排序是日常操作的核心技能之一。无论是处理用户数据、产品列表&#xff0c;还是分析日志信息&#xff0c;合理的排序方法能显著提升代码的效率和可维护性。PHP提供了多种数组排序函数&#xff08;如 sort()、rsort()、asort() 等&#xff09;&#…...

2025年企业Radius认证服务器市场深度调研:中小企业身份安全投入产出比最优解

引言&#xff1a;数字化转型浪潮下的身份安全新命题 在混合办公成为常态、物联网设备呈指数级增长、网络攻击手段日益隐蔽的2025年&#xff0c;企业网络边界正在经历前所未有的重构。据IDC预测&#xff0c;全球企业网络安全投入中&#xff0c;身份与访问管理&#xff08;IAM&a…...

开源模型应用落地-qwen模型小试-Qwen3-8B-快速体验-批量推理(三)

一、前言 阿里云最新推出的 Qwen3-8B 大语言模型,作为国内首个集成“快思考”与“慢思考”能力的混合推理模型,凭借其 80 亿参数规模及 128K 超长上下文支持,正在重塑 AI 应用边界。该模型既可通过轻量化“快思考”实现低算力秒级响应,也能在复杂任务中激活深度推理模式,以…...

相同IP和端口的服务器ssh连接时出现异常

起因 把服务器上的一个虚拟机搞坏了&#xff0c;所以删除重新创建了一个&#xff0c;端口号和IP与之前的虚拟机相同。 ssh usernameIP -p port 时报错 WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! Someone…...

VScode中关于Copilot的骚操作

目录 1. Ctrl I 直接在工作区对话 2.Tab 党福音&#xff1a;写注释生成代码 3. 连续写几行函数头&#xff0c;Copilot 会自动“补全全函数” 4. 自动写单元测试 5. 在注释中要求它写某种风格 6. 代码重写器 7. 多语言切换无痛自动翻译 8. 在空文件中写注释&#xff0c…...

linux inotify 资源详解

Linux 的 inotify 是一个强大的文件系统监控机制&#xff0c;允许应用程序实时监听文件和目录的变化。这对于需要响应文件系统事件的应用&#xff08;如配置热加载、备份工具、文件同步服务等&#xff09;至关重要。以下是对 inotify 资源的深度解析&#xff1a; 一、核心概念…...

Java SE(8)——继承

1.继承的概念&作用 在Java中&#xff0c;继承是面向对象编程的三大基本特性之一&#xff08;还有封装和多态&#xff09;&#xff0c;允许一个类&#xff08;子类/继承类&#xff09;继承另一个类&#xff08;父类/基类&#xff09;的属性和方法 继承的核心目的是&#xf…...

【论文笔记】SOTR: Segmenting Objects with Transformers

【题目】&#xff1a;SOTR: Segmenting Objects with Transformers 【引用格式】&#xff1a;Guo R, Niu D, Qu L, et al. Sotr: Segmenting objects with transformers[C]//Proceedings of the IEEE/CVF international conference on computer vision. 2021: 7157-7166. 【网…...

AIDC智算中心建设:资源池化核心技术解析

目录 一、池化技术架构 二、池化核心技术 三、展望 一、池化技术架构 智能算力池化指依托云计算技术&#xff0c;整合 GPU/AI 芯片等异构算力资源&#xff0c;构建集中管理的资源池&#xff0c;并按上层智算业务的需求&#xff0c;对池化的资源进行统一调度、分配&#xff…...

flink监控指标

文章目录 一、flink yaml配置二、配置指标项情况 提示&#xff1a;以下是基于开源flink on k8s环境下配置监控指标(部分已实验&#xff0c;粗略记录) 一、flink yaml配置 配置完成后就可以在页面查询(部分 需要验证)指标 二、配置指标项情况 参考下面网址&#xff1a; 阿里…...

签名去背景图像处理实例

一、前言 在生活中我们经常用到电子签名&#xff0c;但有时候我们所获取的图像的彩色图像&#xff0c;我们需要获取白底黑字的电子签名&#xff0c;我们可以通过下面程序对彩色图像进行处理达到我们的处理目的。 原始彩色图像如下&#xff1a; 二、原始代码 clear all;close a…...

[人机交互]理解与概念化交互

零.本章重点&#xff08;理解和分析用户问题&#xff09; – 解释“问题空间”的概念和含义 – 解释如何概念化交互 – 描述什么是概念模型 – 讨论将界面隐喻作为概念模型的利弊 – 讨论界面具体化和抽象化各自的优缺点 – 概述概念设计和实际设计的关系 一.理解问题空间 简单…...

C与指针——常见库函数

字符串 #include<stdlibs.h> int abs(int); long labs(long); int rand(void);//0-RAND_MAX //字符串转值 int atoi(const char*); long atol(const char*); float atof(const char*);数学\排序 #include<math.h> \\常见三角&#xff0c;sqrt(); exp(); double p…...

【C++指南】STL list容器完全解读(一):从入门到掌握基础操作

. &#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;《C指南》 期待您的关注 文章目录 一、初识list容器1.1 什么是list&#xff1f;1.2 核心特性1.3 典型应用场景 二、核心成员函数…...