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

IcePlayer音乐播放器项目分析及学习指南

IcePlayer音乐播放器项目分析及学习指南

项目概述

IcePlayer是一个基于Qt5框架开发的音乐播放器应用程序,使用Visual Studio 2013作为开发环境。该项目实现了音乐播放、歌词显示、专辑图片获取等功能,展现了桌面应用程序开发的核心技术和设计思想。

技术栈

  • C++: 核心编程语言
  • Qt5框架: GUI开发框架
    • QMediaPlayer: 音频播放功能
    • QNetworkAccessManager: 网络请求处理
    • QWidget: 界面组件
  • Visual Studio 2013: 开发环境
  • JSON解析: 处理网络API返回数据

功能特点

从项目代码和README中可以看出,该音乐播放器具有以下功能:

  1. 基础播放功能:播放、暂停、上一曲、下一曲、音量控制
  2. 播放列表管理:添加、删除、清空歌曲
  3. 播放模式:单曲播放、列表循环、单曲循环、随机播放
  4. 桌面歌词:展示同步歌词
  5. 迷你模式:提供简洁的迷你界面
  6. 网络功能
    • 获取在线歌词
    • 获取专辑封面
    • 获取歌曲信息
  7. 本地文件操作
    • 支持拖拽添加歌曲
    • 自动保存播放列表
    • 支持作为默认mp3播放器

技术实现重点

1. 音频播放与控制

  • QMediaPlayer实现
    • 使用Qt的QMediaPlayer类实现音频播放核心功能
    • 通过QMediaPlaylist管理播放列表
    • 实现了多种播放模式(单曲、循环、随机)切换
    • 音量控制和进度拖动功能
// 播放功能示例代码
mediaPlayer = new QMediaPlayer();
mediaList = new QMediaPlaylist();
mediaPlayer->setPlaylist(mediaList);
// 连接信号槽
connect(mediaPlayer, SIGNAL(stateChanged(QMediaPlayer::State)), this, SLOT(ice_update_state(QMediaPlayer::State)));

2. 网络模块与数据获取

  • 单例模式网络请求
    • 使用单例模式设计网络请求模块
    • 基于QNetworkAccessManager实现异步HTTP请求
    • JSON解析获取歌曲信息和歌词
// 网络模块单例模式实现
static NetWorker *instance()
{static NetWorker instance;return &instance;
}// 异步网络请求
void NetWorker::get(const QString &url)
{QNetworkRequest request;request.setUrl(QUrl(url));QNetworkReply *reply = d->manager->get(request);connect(reply, SIGNAL(finished()), d, SLOT(onFinished()));
}

3. 歌词解析与显示

  • LRC文件解析
    • 实现了LRC格式歌词文件的解析
    • 使用正则表达式提取时间戳和歌词文本
    • 建立时间戳和歌词的映射关系
// 歌词解析示例
bool IcePlayer::ice_resolve_lrc(const QString &source_file_name)
{QFile file(source_file_name);if (!file.open(QIODevice::ReadOnly | QIODevice::Text))return false;QTextStream in(&file);in.setCodec("UTF-8");// 正则表达式匹配时间标签QRegExp rx("\\[(\\d+):(\\d+)\\.(\\d+)\\]");while (!in.atEnd()) {QString line = in.readLine();int pos = 0;while ((pos = rx.indexIn(line, pos)) != -1) {// 提取时间戳int minute = rx.cap(1).toInt();int second = rx.cap(2).toInt();int millisecond = rx.cap(3).toInt();qint64 totalTime = minute * 60000 + second * 1000 + millisecond * 10;// 提取对应的歌词文本QString text = line.mid(rx.pos() + rx.matchedLength());// 存入映射lrcMap.insert(totalTime, text);pos += rx.matchedLength();}}return true;
}

4. 自定义UI组件

  • 自定义控件
    • 开发了自定义按钮和标签控件
    • 重写绘制事件实现特定的视觉效果
    • 自定义事件处理实现特殊交互效果
// 自定义按钮绘制事件
void ICE_Ice_Button::paintEvent(QPaintEvent *event)
{QPainter painter(this);painter.setRenderHint(QPainter::Antialiasing, true);if (isPressed) {// 按下状态绘制painter.drawPixmap(rect(), pressedPixmap);} else if (isHovered) {// 悬停状态绘制painter.drawPixmap(rect(), hoveredPixmap);} else {// 正常状态绘制painter.drawPixmap(rect(), normalPixmap);}
}

5. 跨窗口通信

  • 窗口间数据同步
    • 主窗口与迷你窗口之间的状态同步
    • 使用信号槽机制实现数据双向绑定
    • 窗口切换时保持播放状态一致
// 主窗口和迷你窗口通信示例
// 在迷你窗口中
connect(ui->playButton, SIGNAL(clicked()), this, SLOT(mini_play_clicked()));// 迷你窗口向主窗口发送信号
void miniwindow::mini_play_clicked()
{mainWindow->ICE_play_button_clicked();
}

面试中项目介绍

以下是在面试中如何介绍该项目的简要说明(1-2分钟版本):

"我使用C++和Qt5框架开发了一个名为IcePlayer的音乐播放器应用。这个项目主要实现了音乐播放、歌词显示、在线数据获取等功能。

在技术实现上,我使用了QMediaPlayer处理音频播放,设计了基于单例模式的网络模块来获取在线歌词和专辑封面,并实现了LRC格式歌词文件的解析与同步显示。项目采用了MVC架构模式,将数据处理、UI显示和控制逻辑分离,提高了代码的可维护性。

在开发过程中,我重点解决了几个技术难点:一是实现了异步网络请求与数据解析,确保UI响应不被阻塞;二是开发了自定义UI控件,提升了用户体验;三是设计了主窗口与迷你窗口的状态同步机制,保证了不同界面下的一致性。

这个项目让我深入理解了Qt框架的工作原理,特别是信号槽机制和事件驱动编程模型,同时也提升了我在多媒体应用开发和网络编程方面的能力。"

面试问答实例

问题1:介绍一下你在项目中使用的设计模式以及应用场景

回答
"在IcePlayer项目中,我主要应用了以下设计模式:

  1. 单例模式:我在网络请求模块中使用了单例模式。通过静态方法NetWorker::instance()获取唯一实例,确保全局只有一个网络管理器,避免了资源浪费和状态不一致问题。这对于管理有限的网络连接资源非常有效。

  2. 观察者模式:Qt的信号槽机制本质上是观察者模式的实现。例如,播放器状态变化时,我通过信号槽机制通知UI更新,使得界面能够反映最新的播放状态,如播放/暂停按钮的切换、进度条的更新等。

  3. MVC模式:我将应用划分为数据模型(歌曲信息、播放列表)、视图(主界面、迷你界面)和控制器(播放控制逻辑)三部分。这种分离使得代码更加清晰,例如修改UI时不会影响底层逻辑,便于后期维护和功能扩展。

这些设计模式的应用大大提高了代码的可维护性和可扩展性,也使项目结构更加清晰合理。"

问题2:请详细说明你是如何实现歌词同步显示功能的

回答
"歌词同步显示是我实现的一个核心功能,主要包含以下步骤:

  1. 歌词文件解析:首先我实现了LRC格式歌词文件的解析器。使用正则表达式提取歌词中的时间戳和对应文本,然后建立一个QMap<qint64, QString>结构,将时间戳(毫秒)与歌词文本对应起来。

  2. 播放进度监听:通过连接QMediaPlayer的positionChanged信号,我能够实时获取当前播放位置。

connect(mediaPlayer, SIGNAL(positionChanged(qint64)), this, SLOT(ice_update_position(qint64)));
  1. 歌词定位算法:在ice_update_position槽函数中,我实现了一个算法来查找当前时间戳最接近的歌词:

    • 遍历时间戳-歌词映射
    • 找出时间戳小于等于当前播放位置的最大时间戳
    • 展示对应的歌词文本
  2. UI更新:找到匹配的歌词后,更新显示组件,包括主界面和桌面歌词。桌面歌词通过创建一个透明的顶层窗口实现,使用自定义绘制方法实现描边和阴影效果。

  3. 性能优化:为避免频繁UI更新影响性能,我添加了一个判断,只有当当前应显示的歌词与上一次不同时才更新界面。

这个功能挑战在于准确匹配时间戳和高效更新UI,我通过优化查找算法和减少不必要的UI刷新来提升性能和用户体验。"

问题3:你是如何处理网络请求过程中的异常情况的?

回答
"在网络功能实现中,异常处理是确保应用稳定性的关键。我采取了以下策略:

  1. 超时处理:为每个网络请求设置了超时时间,避免因网络问题导致应用长时间等待。
QNetworkRequest request;
request.setAttribute(QNetworkRequest::FollowRedirectsAttribute, true);
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
request.setAttribute(QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::AlwaysNetwork);
// 设置超时
QTimer *timer = new QTimer();
timer->setSingleShot(true);
connect(timer, SIGNAL(timeout()), this, SLOT(onTimeout()));
timer->start(5000); // 5秒超时
  1. 错误处理:针对不同类型的网络错误(如连接失败、服务器错误),实现了专门的错误处理逻辑。
void onFinished()
{QNetworkReply *reply = qobject_cast<QNetworkReply*>(sender());if (reply->error() != QNetworkReply::NoError) {// 错误处理QString errorString = reply->errorString();// 记录日志或显示错误信息// 执行降级策略} else {// 正常处理响应}reply->deleteLater();
}
  1. 降级策略:当网络请求失败时,我实现了降级方案,例如:

    • 当在线歌词获取失败时,尝试读取本地歌词文件
    • 当专辑图片下载失败时,显示默认封面图片
    • 缓存之前成功请求的结果,在网络不可用时使用缓存
  2. 用户体验优化:在网络请求过程中,添加了加载指示器,并确保UI不会因为网络请求阻塞而变得不响应。网络操作都在单独的线程中进行,避免影响主线程的UI响应。

  3. 重试机制:对于重要的网络请求,如歌词获取,实现了有限次数的自动重试机制。

这些措施确保了应用在各种网络环境下都能提供良好的用户体验,即使在网络不稳定的情况下也能保持基本功能正常运行。"

问题4:你是如何优化播放器性能的?特别是在处理大量歌曲时

回答
"在优化IcePlayer性能方面,我主要从以下几个方向入手:

  1. 延迟加载:播放列表采用延迟加载策略,初始只加载基本信息(如文件名),详细元数据(如专辑、艺术家)仅在需要显示时才加载。这大大提高了启动速度和添加大量歌曲时的响应速度。
// 仅在选中或播放时加载详细信息
void ice_load_meta_data(const QString &filePath)
{if (!loadedMetaDataFiles.contains(filePath)) {// 加载详细元数据// 将文件路径添加到已加载集合loadedMetaDataFiles.insert(filePath);}
}
  1. 资源缓存

    • 为歌曲元数据建立缓存机制,避免重复读取
    • 专辑封面和歌词文件存储在本地,减少重复网络请求
    • 使用内存缓存频繁访问的数据,如当前播放列表的元数据
  2. UI渲染优化

    • 实现虚拟列表,只渲染可见区域的播放列表项
    • 减少UI刷新频率,例如播放进度更新使用定时器控制频率
    • 使用QPixmapCache缓存UI图像资源
  3. 多线程处理

    • 文件读取和网络请求在工作线程中进行,避免阻塞UI线程
    • 歌曲元数据解析在单独线程中执行,提升响应速度
// 多线程加载示例
QFuture<void> future = QtConcurrent::run([this, filePaths]() {for (const QString &filePath : filePaths) {// 在后台线程中加载文件信息SongInfo info = SongInfo::fromFile(filePath);// 使用信号通知主线程更新UIemit songInfoLoaded(info);}
});
  1. 内存管理
    • 适当使用智能指针管理资源,避免内存泄漏
    • 大型资源如专辑图片使用时才加载,不使用时释放
    • 定期清理不再需要的缓存数据

通过这些优化,IcePlayer能够流畅处理包含数千首歌曲的播放列表,同时保持较低的内存占用和响应延迟。在实际测试中,播放列表加载速度提升了约70%,内存占用减少了约30%。"

学习路径

1. 基础知识准备

  • C++基础

    • 面向对象编程
    • STL库的使用
    • 智能指针
    • C++11特性
  • Qt框架

    • Qt基础组件
    • 信号槽机制
    • 界面布局
    • 事件处理
    • 多媒体模块
    • 网络模块
  • 设计模式

    • 单例模式
    • 观察者模式(信号槽)
    • MVC模式

2. 学习顺序

  1. 环境搭建

    • 安装Visual Studio
    • 配置Qt开发环境
    • 熟悉Qt Creator IDE
  2. 项目结构分析

    • 理解项目文件组织
    • 阅读main.cpp了解程序入口
  3. 核心功能学习

    • 音频播放实现 (QMediaPlayer)
    • 界面布局与控件
    • 播放控制逻辑
  4. 进阶功能学习

    • 网络请求实现
    • 歌词解析与显示
    • 本地文件操作
  5. 扩展开发

    • 添加新功能(如音频可视化)
    • 改进界面设计
    • 优化性能

3. 实践项目

  • 简化版播放器:实现基本播放功能
  • 歌词显示模块:独立实现歌词解析与显示
  • 网络音乐搜索:扩展API调用功能
  • 音频可视化:添加音频频谱显示

简历撰写指南

项目经验部分示例

基于Qt的音乐播放器项目
- 使用C++/Qt5开发了一个功能完善的音乐播放器应用
- 实现了基础播放控制、播放列表管理、多种播放模式等功能
- 设计并实现了网络模块,支持获取在线歌词和专辑封面
- 独立开发了桌面歌词显示功能,提升用户体验
- 应用MVC架构和单例模式优化代码结构,提高代码复用性和可维护性
- 解决了多线程环境下的资源竞争问题,确保应用稳定性

技能亮点

  1. C++/Qt开发:强调对桌面应用程序开发的熟悉程度
  2. 音频处理:展示多媒体开发能力
  3. 网络编程:突出API调用和网络请求处理能力
  4. UI设计:强调用户体验和界面设计能力
  5. 设计模式应用:体现软件工程和架构设计能力

相关关键词

在简历中适当使用以下关键词:

  • 桌面应用开发
  • 多媒体应用
  • Qt框架
  • 信号槽机制
  • API集成
  • MVC架构
  • 多线程
  • 单例模式
  • 事件驱动编程

可能面临的面试问题

技术问题

  1. C++/Qt相关

    • Qt信号槽机制的原理和使用
    • Qt多线程编程的注意事项
    • C++内存管理与Qt对象生命周期
    • Qt事件循环机制
  2. 音频处理

    • 音频播放的技术原理
    • 音频格式与解码
    • 音频处理的性能优化
  3. 网络编程

    • HTTP请求的处理方式
    • 网络异常处理策略
    • 异步网络请求的实现
  4. 项目实现

    • 歌词解析算法的实现
    • 播放列表的数据结构设计
    • 如何优化大量歌曲的加载性能

系统设计问题

  1. 如何设计一个支持插件扩展的音乐播放器
  2. 面对大量音乐文件时如何优化播放列表管理
  3. 如何设计一个更高效的音乐文件索引系统
  4. 桌面应用与云服务结合的架构设计

学习资源推荐

  1. 书籍

    • 《C++ GUI Qt4编程》(作者:Jasmin Blanchette)
    • 《Effective C++》(作者:Scott Meyers)
    • 《Qt5开发及实例》(作者:闫冬)
  2. 在线资源

    • Qt官方文档: https://doc.qt.io/
    • Qt示例: https://doc.qt.io/qt-5/examples-widgets.html
    • C++ Reference: https://en.cppreference.com/
  3. 视频教程

    • Qt入门与提高 (B站)
    • C++进阶教程
    • 设计模式视频教程

总结

IcePlayer项目是一个优秀的C++/Qt学习案例,通过学习该项目可以掌握:

  1. Qt桌面应用程序开发的完整流程
  2. 音频处理与多媒体应用开发技术
  3. 网络编程与API调用的实践经验
  4. 界面设计与用户交互的实现方法
  5. 设计模式在实际项目中的应用

对于计算机专业学生来说,深入研究此类项目能够强化编程能力,培养软件工程思想,为将来从事软件开发工作奠定良好基础。在简历中展示此类项目经验,可以有效提升在软件开发岗位上的竞争力。

相关文章:

IcePlayer音乐播放器项目分析及学习指南

IcePlayer音乐播放器项目分析及学习指南 项目概述 IcePlayer是一个基于Qt5框架开发的音乐播放器应用程序&#xff0c;使用Visual Studio 2013作为开发环境。该项目实现了音乐播放、歌词显示、专辑图片获取等功能&#xff0c;展现了桌面应用程序开发的核心技术和设计思想。 技…...

【ELF2学习板】Ne10进行FFT测试

目录 引言 Ne10简介 交叉编译Ne10 测试 测试程序 测试结果 结语 引言 在上一篇博文介绍了FFTW在ELF2开发板的测试。其中我们提到--enable-neon选项在aarch64平台下无法启用。接下来测试一个专门用NEON指令优化的FFT库Ne10。 Ne10简介 NE10 是一个面向 ARM 架构的开源数…...

Android device PCO (protocol configuration options) intro

术语 英文缩写英文全称中文PCOprotocol configuration options协议配置选项RILradio interface layer 无线电接口层PCO介绍 PCO(Protocol Configuration Options) 是 3GPP 标准协议(TS 24.008)中定义的核心概念,用于在 LTE/5G 网络建立 PDN 连接时传递动态配置参数(如 D…...

HAL库通过FATFS和SDIO+DMA写入SD卡数据错误

HAL库F4版本 1.28.1 最近在使用HAL库配置SDIODMA并通过FATFS向SD卡写入数据&#xff0c;但是发现写入的数据经常有错误&#xff0c;不是少了一部分就是多了一部分&#xff0c;写入的数据为csv格式&#xff0c;通过循环向缓冲区写入"100100,12.345678\r\n"数据来观察问…...

RK Android11 修改默认语言为法语及时区为巴黎时间

文章目录 1、需求2、解决 1、需求 客户要求将系统默认语言改为法语&#xff0c;系统默认时区改为巴黎时间&#xff08;也称为欧洲中部时间&#xff09;2、解决 --- a/build/make/tools/buildinfo.shb/build/make/tools/buildinfo.sh-46,7 46,7 echo "ro.product.cpu.ab…...

文件上传Ⅰ

文件上传--前后端验证 不让上传php,所以要绕过它 遇到网站可能不是php语言&#xff0c;会是java或者python语言等&#xff0c;它只能解析网站本身的语言&#xff0c;那我们就上传符合网站语言识别的格式&#xff08;它能解析什么后缀&#xff0c;就上传什么后缀&#xff09;&…...

IntelliJ IDEA clean git password

IntelliJ IDEA clean git password 清除git密码 方法一&#xff1a;&#xff08;这个要特别注意啊&#xff0c;恢复默认设置&#xff0c;你的插件什么要重新下载了&#xff09; File->Manage IDE Settings->Restore Default Settings以恢复IDEA的默认设置(可选); 清空…...

【C++指南】哈希驱动的封装:如何让unordered_map/set飞得更快更稳?【上】

&#x1f31f; 各位看官好&#xff0c;我是egoist2023&#xff01; &#x1f30d; 种一棵树最好是十年前&#xff0c;其次是现在&#xff01; &#x1f4ac; 注意&#xff1a;本文在哈希函数中主讲除法散列法&#xff0c;乘法散列法、全域散列法、双重散列等自行了解。 &#x…...

论坛测试报告

作者前言 &#x1f382; ✨✨✨✨✨✨&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f382; ​&#x1f382; 作者介绍&#xff1a; &#x1f382;&#x1f382; &#x1f382; &#x1f389;&#x1f389;&#x1f389…...

人脸扫描黑科技:多相机人脸扫描设备,打造你的专属数字分身

随着科技的迅猛发展&#xff0c;人脸扫描这个词已经并不陌生&#xff0c;通过人脸扫描设备制作超写实人脸可以为影视制作打造逼真角色、提升游戏沉浸感&#xff0c;还能助力教育机构等领域生产数字人以丰富教学资源&#xff0c;还在安防、身份识别等领域发挥关键作用&#xff0…...

统计字符串每个字符出现频率

输入一个字符串&#xff0c;统计每个字符的出现频率&#xff0c;然后判断最大频率与最小频率的差值 cnt&#xff1a; 如果 cnt 是质数&#xff0c;则输出 "Lucky Word" 和 差值&#xff1b; 否则输出 "No Answer" 和 0。 #include <bits/stdc.h> u…...

SQL-子查询

SQL子查询是嵌套在另一个SQL查询中的SELECT语句&#xff0c;将内部查询的结果作为外部查询的条件或者数据源。 核心概念 子查询是一个完整的SELECT语句&#xff0c;可以嵌入到其他查询的where, from, SELECT, HAVING等子句中&#xff0c;用于动态生成条件或临时数据集。 例如…...

Python(21)Python日期时间完全指南:从基础到实战注意事项

目录 一、背景与核心价值二、核心模块详解与实战2.1 datetime模块四剑客2.2 时区处理黄金法则 三、企业级应用案例3.1 全球日志分析系统3.2 金融交易时间校验 四、六大核心注意事项1. 时区意识优先原则‌2. 时间戳的精度陷阱‌3. 夏令时转换三步骤4. 日期格式化安全指南‌5. 性…...

【医学影像 AI】早产儿视网膜病变国际分类(第三版)

【医学影像 AI】早产儿视网膜病变国际分类&#xff08;第三版&#xff09; 0. 论文简介0.1 基本信息0.2 摘要0.3 缩略语0.4 ICROP3的关键内容总结 1. 引言2. 血管化位置&#xff1a;区域&#xff08;ZONE&#xff09;3. 加重病变与前加重病变4. 急性病变分期&#xff08;阶段1-…...

焊接机器人的设计

一、引言 随着制造业的发展&#xff0c;焊接工艺在各个领域得到广泛应用。焊接机器人具有焊接质量高、效率高、劳动强度低等优点&#xff0c;能够满足现代制造业对焊接生产的要求。设计一款性能优良的焊接机器人&#xff0c;对于提高焊接生产的自动化水平和产品质量具有重要意…...

SQL SERVER里面也可以插入存储过程,操作TCP,WEBSOCKET吗?数据发生改变时用于通知客户端

SQL SERVER里面也可以插入存储过程,操作TCP,WEBSOCKET吗?数据发生改变时用于通知客户端SQL存储过程入门&#x1f525; - 人生得E不早朝 深度思考完成 用时28秒 好的&#xff0c;用户的问题是&#xff1a;SQL Server里面是否可以通过插入存储过程来操作TCP或WebSocket&…...

利用 DeepSeek-R1 模型和计算机视觉微调模型实现马铃薯叶片疾病识别和分类

一、需求背景 在农业现代化进程中&#xff0c;作物健康监测对于保障粮食安全和提高农业生产效率起着举足轻重的作用。马铃薯作为全球重要的粮食作物之一&#xff0c;其种植面积广泛&#xff0c;产量和质量直接关系到众多农户的生计以及食品供应链的稳定。准确、快速地鉴别马铃…...

文章记单词 | 第39篇(六级)

一&#xff0c;单词释义 themselves [əmˈselvz] pron. 他们自己&#xff1b;她们自己&#xff1b;它们自己&#xff1b;&#xff08;用以加强语气&#xff09;他们亲自&#xff0c;她们亲自&#xff0c;它们亲自&#xff1b;&#xff08;反身代词&#xff09; 指某人或某物本…...

深入理解C++中string的深浅拷贝

目录 一、引言 二、浅拷贝与深拷贝的基本概念 2.1 浅拷贝 2.2 深拷贝 在C 中&#xff0c; string 类的深浅拷贝有着重要的区别。 浅拷贝 深拷贝 string 类中的其他构造函数及操作 resize 构造 构造&#xff08;赋值构造&#xff09; 构造&#xff08;拼接构造&#xf…...

C++ 常用的智能指针

C 智能指针 一、智能指针类型概览 C 标准库提供以下智能指针&#xff08;需包含头文件 <memory>&#xff09;&#xff1a; unique_ptr&#xff1a;独占所有权&#xff0c;不可复制&#xff0c; 可移动shared_ptr&#xff1a;共享所有权&#xff0c;用于引用计数weak_pt…...

【AI部署】腾讯云GPU-常见故障—SadTalker的AI数字人视频—未来之窗超算中心 tb-lightly

ERROR: Could not find a version that satisfies the requirement tb-nightly (from torchreid) (from versions: none) ERROR: No matching distribution found for tb-nightly 解决 阿里云 python -m pip install tb-nightly -i https://mirrors.aliyun.com/pypi/simple …...

三大等待和三大切换

三大等待 1、三大等待&#xff1a;等待的方式有三种&#xff1a;强制等待&#xff0c;隐性等待&#xff0c;显性等待。 1、强制等待&#xff1a;time.sleep(2)&#xff0c;秒 优点&#xff1a;使用简单缺点&#xff1a;等待时间把握不准&#xff0c;容易造成时间浪费或者等待时…...

工程化实践:Flutter项目结构与规范

工程化实践&#xff1a;Flutter项目结构与规范 在Flutter项目开发中&#xff0c;良好的工程化实践对于提高开发效率、保证代码质量和团队协作至关重要。本文将从项目结构、代码规范、CI/CD流程搭建以及包管理等方面&#xff0c;详细介绍Flutter项目的工程化最佳实践。 项目结…...

数据结构-Map和Set

文章目录 1. 搜索树2. Map3. Set4. 哈希表4.1 哈希表的基本概念4.2 哈希表的实现方法4.3 Java中的哈希表实现 5. 哈希桶哈希桶的实现方式哈希桶的作用哈希桶的应用模拟实现 1. 搜索树 二叉搜索树&#xff08;Binary Search Tree, BST&#xff09;是一种特殊的二叉树&#xff0…...

cpolar 内网穿透 实现公网可以访问本机

1、登录网站&#xff0c;升级成专业版&#xff0c;测试的话建议选一个月付费&#xff0c;选择预留 2、保留的TCP地址增加一条记录&#xff0c;描述可以自己取 3、验证&#xff0c;生成一个Authtocken码 4、在安装目录下&#xff0c;打开CMD命令&#xff0c;复制上面的码运行aut…...

QT调用ffmpeg库实现视频录制

可以通过QProcess调用ffmpeg命令行,也可以直接调用ffmpeg库,方便。 调用库 安装ffmpeg ffmpeg -version 没装就装 sudo apt-get update sudo apt-get install ffmpeg sudo apt-get install ffmpeg libavdevice-dev .pro引入库路径,引入库 LIBS += -L/usr/lib/aarch64-l…...

AI专题(一)----NLP2SQL探索以及解决方案

前面写了很多编码、算法、底层计算机原理等相关的技术专题&#xff0c;由于工作方向调整的缘故&#xff0c;今天开始切入AI人工智能相关介绍。本来按照规划&#xff0c;应该先从大模型的原理开始介绍会比较合适&#xff0c;但是计划赶不上变化&#xff0c;前面通用大模型的工作…...

Redis 的指令执行方式:Pipeline、事务与 Lua 脚本的对比

Pipeline 客户端将多条命令打包发送&#xff0c;服务器顺序执行并一次性返回所有结果。可以减少网络往返延迟&#xff08;RTT&#xff09;以提升吞吐量。 需要注意的是&#xff0c;Pipeline 中的命令按顺序执行&#xff0c;但中间可能被其他客户端的命令打断。 典型场景&…...

群辉默认docker数据存储路径

做一下笔记 今天不小心路径规划错误&#xff0c;好不容易找到了数据&#xff0c;特此做个路径记录。 /var/packages/ContainerManager/var/docker/...

【C++】入门基础【上】

目录 一、C的发展历史二、C学习书籍推荐三、C的第一个程序1、命名空间namespace2、命名空间的使用3、头文件<iostream>是干什么的&#xff1f; 个人主页<—请点击 C专栏<—请点击 一、C的发展历史 C的起源可以追溯到1979年&#xff0c;当时Bjarne Stroustrup(本…...

Git LFS 学习笔记:原理、配置、实践与心路历程

最近在学习 Git LFS&#xff0c;把一些零散的笔记整理成一篇博文&#xff0c;记录我的学习思路与心路历程。以下内容均为个人理解总结&#xff0c;部分尚未在生产项目中验证&#xff0c;仅供回顾与参考。 &#x1f50d; Git LFS 是什么&#xff1f;原理是什么&#xff1f; 刚接…...

SpringBoot集成oshi 查询系统数据

实现功能&#xff1a; ​​​​​​​ <!-- 获取系统信息 --><dependency><groupId>com.github.oshi</groupId><artifactId>oshi-core</artifactId><version>6.6.1</version></dependency><dependency><groupI…...

iOS Facebook 登录

iOS Facebook 登录 官方文档 SDK下载链接...

uniapp打包IOS私钥证书过期了,如何在非mac系统操作

在非Mac系统下解决uniapp打包iOS私钥证书过期的问题&#xff0c;需通过以下步骤实现&#xff1a; --- ### **一、重新生成iOS证书&#xff08;非Mac环境操作&#xff09;** 1. **生成私钥和CSR文件** 使用OpenSSL工具&#xff08;需提前安装&#xff09;生成私钥和证书签…...

Axios的使用

Axios 是一个基于 Promise 的现代化 HTTP 客户端库&#xff0c;专为浏览器和 Node.js 设计。在企业级应用中&#xff0c;它凭借以下核心优势成为首选方案&#xff1a; 一、Axios 的核心优势 特性说明Promise 支持天然支持异步编程&#xff0c;避免回调地狱拦截器机制可全局拦截…...

第八篇:系统分析师第三遍——3、4章

目录 一、目标二、计划三、完成情况四、意外之喜(最少2点)1.计划内的明确认知和思想的提升标志2.计划外的具体事情提升内容和标志 五、总结 一、目标 通过参加考试&#xff0c;训练学习能力&#xff0c;而非单纯以拿证为目的。 1.在复习过程中&#xff0c;训练快速阅读能力、掌…...

【2025-泛计算机类-保研/考研经验帖征集】

【2025-泛计算机类-保研/考研经验帖征集】 打扰您1分钟时间看下这里&#xff1a; 这是一个无偿为爱发电的项目&#xff0c;旨在收集湖南大学2025届毕业的计算机类学科同学的经验帖&#xff0c; 我将定期汇总链接&#xff0c;在校内推免群中宣传&#xff0c;为校内的学弟学妹们…...

Flink介绍——实时计算核心论文之Kafka论文详解

引入 我们通过S4和Storm论文的以下文章&#xff0c;已经对S4和Storm有了不错的认识&#xff1a; S4论文详解S4论文总结Storm论文详解Storm论文总结 不过&#xff0c;在讲解这两篇论文的时候&#xff0c;我们其实没有去搞清楚对应的流式数据是从哪里来的。虽然S4里有Keyless …...

细节:如何制作高质量的VR全景图

细节&#xff1a;如何制作高质量的VR全景图 VR全景图是通过虚拟现实和3D技术实现的全景展示方式&#xff0c;能够将实景以1:1的比例等比复刻&#xff0c;并还原到互联网上&#xff0c;使用户能够在线上游览世界&#xff0c;获得沉浸式的体验。制作高质量的VR全景图是一个复杂而…...

深度学习中的概念——元素积(哈达玛积)

元素积操作&#xff08;哈达玛积&#xff09; &#x1f522; 基本定义 矩阵的哈达玛积 对于两个同维度的矩阵&#xff1a; A [ a i j ] , B [ b i j ] A [a_{ij}], \quad B [b_{ij}] A[aij​],B[bij​] 它们的哈达玛积定义为&#xff1a; C A ∘ B 其中 c i j a i j…...

探索 Flowable 后端表达式:简化流程自动化

什么是后端表达式&#xff1f; 在 Flowable 中&#xff0c;后端表达式是一种强大的工具&#xff0c;用于在流程、案例或决策表执行期间动态获取或设置变量。它还能实现自定义逻辑&#xff0c;或将复杂逻辑委托…… 后端表达式在 Flowable 的后端运行&#xff0c;无法访问前端…...

AI语音助手 React 组件使用js-audio-recorder实现,将获取到的语音转成base64发送给后端,后端接口返回文本内容

页面效果&#xff1a; js代码&#xff1a; import React, { useState, useRef, useEffect } from react; import { Layout, List, Input, Button, Avatar, Space, Typography, message } from antd; import { SendOutlined, UserOutlined, RobotOutlined, AudioOutlined, Stop…...

《软件设计师》复习笔记(11.6)——系统转换、系统维护、系统评价

目录 一、遗留系统&#xff08;Legacy System&#xff09; 定义&#xff1a; 特点&#xff1a; 演化策略&#xff08;基于价值与技术评估&#xff09;&#xff1a; 高水平 - 低价值&#xff1a; 高水平 - 高价值&#xff1a; 低水平 - 低价值&#xff1a; 低水平 - 高价…...

学习threejs,使用EffectComposer后期处理组合器(采用RenderPass、GlitchPass渲染通道)

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️THREE.EffectComposer 后期…...

Yarn的定义?

YARN&#xff08;Yet Another Resource Negotiator&#xff09; 是 Apache Hadoop 的核心组件之一&#xff0c;负责集群的资源管理和任务调度。它的主要作用是将 Hadoop 的资源管理和作业调度/监控功能分离&#xff0c;形成一个通用的资源管理平台&#xff0c;可以支持多种计算…...

职坐标IT培训热门技术实战精讲

在数字化转型浪潮中&#xff0c;人工智能、大数据与云原生已成为驱动产业升级的核心引擎。职坐标IT培训课程以实战导向为基石&#xff0c;聚焦高薪岗位核心技术栈&#xff0c;通过拆解企业级项目案例&#xff0c;将复杂的技术理论转化为可落地的工程实践。课程模块涵盖从架构设…...

前端:uniapp框架中<scroll-view>r如何控制元素进行局部滚动

以下是使用 <scroll-view> 实现局部滚动的完整示例&#xff0c;包含动态内容、滚动控制和滚动位置监听&#xff1a; 一、基础局部滚动示例 <template><view class"container"><!-- 固定高度的滚动容器 --><scroll-view scroll-y :scroll…...

【KWDB 创作者计划】_算法篇---Stockwell变换

文章目录 前言一、Stockwell变换原理详解1.1 连续S变换定义1.2 离散S变换1.3简介 二、S变换的核心特点2.1频率自适应的时频分辨率2.1.1高频区域2.1.2低频区域 2.2无交叉项干扰2.3完全可逆2.4相位保持2.5与傅里叶谱的直接关系 三、应用领域3.1地震信号分析3.2生物医学信号处理3.…...

桌面级OTA测试解决方案:赋能智能网联汽车高效升级

一、前言 随着智能网联汽车的快速发展&#xff0c;OTA&#xff08;Over-The-Air&#xff09;技术已成为汽车软件更新和功能迭代的关键手段。为确保OTA升级的可靠性、安全性和效率&#xff0c;构建一套高效、便捷的桌面级OTA测试解决方案至关重要。 本方案基于Vector先进的软硬…...

京东物流基于Flink StarRocks的湖仓建设实践

摘要&#xff1a;本文整理自京东物流高级数据开发工程师梁宝彬先生在 Flink Forward Asia 2024 论坛中的分享。内容主要为以下四个部分&#xff1a; 1、实时湖仓探索与建设 2、实时湖仓应用 3、问题与思考 4、未来展望 今天&#xff0c;将分享的主题大纲包括&#xff1a;首先&a…...