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

Qt应用程序启动时的一些思路:从单实例到性能优化的处理方案

程序启动时优化的价值

在桌面软件开发领域,应用程序的启动过程就像音乐的序曲,决定了用户对软件品质的第一印象。比如首次启动等待超过3秒时,会让大多数用户产生负面看法,而专业工具软件的容忍阈值甚至更低。Qt框架作为跨平台开发的利器,其启动过程的优化不仅关乎用户体验,更直接影响软件的稳定性和可维护性。

本文将从工程实践角度出发,深入剖析Qt应用程序启动阶段的五个关键技术点。

一、单实例运行的工程级解决方案

1.1 行业标准实现方案对比

  • 共享内存方案(QSharedMemory)
  • 本地Socket方案(QLocalServer)
  • 文件锁方案(QFileLock)
  • 进程枚举法(QProcess)

1.2 混合型单实例防护体系

采用自己写一个检测程序来监听是否单实例。

class InstanceGuard : public QObject {//使用Qt的共享内存QSharedMemory m_sharedMem;QLocalServer m_localServer;
public:explicit InstanceGuard(const QString& appKey) {// 双重检测机制m_sharedMem.setKey(appKey + "_mem");if(m_sharedMem.attach()) {m_sharedMem.detach();return;}m_localServer.listen(appKey + "_sock");connect(&m_localServer, &QLocalServer::newConnection, [=]{// 激活现有实例的处理逻辑});}
};

1.3 单实例模型类

也可以自己设计一个类,继承自QApplication,使用本地服务的形式,完成单实例的功能,然后让主程序继承字这个类。

#include "singleapplication.h"#include <QLocalServer>
#include <QLocalSocket>
#include <QFile>
#include <QFileInfo>
#include <QTextStream>SingleApplication::SingleApplication(int &argc, char **argv): QApplication(argc, argv),m_bRunning(false)
{QCoreApplication::setOrganizationName("SmartSafe");QCoreApplication::setApplicationName("TreadCheck313");QString strServerName = QCoreApplication::organizationName() + QCoreApplication::applicationName();//strServerName = QFileInfo(QCoreApplication::applicationFilePath()).fileName();QLocalSocket socket;socket.connectToServer(strServerName);if (socket.waitForConnected(500)){QTextStream stream(&socket);QStringList args = QCoreApplication::arguments();QString strArg = (args.count() > 1) ? args.last() : "";stream << strArg;stream.flush();qDebug() << "Have already connected to server.";socket.waitForBytesWritten();m_bRunning = true;}else{// 如果不能连接到服务器,则创建一个m_pServer = new QLocalServer(this);connect(m_pServer, SIGNAL(newConnection()), this, SLOT(newLocalConnection()));if (m_pServer->listen(strServerName)){// 放置程序崩溃,残留进程服务,直接移除if ((m_pServer->serverError() == QAbstractSocket::AddressInUseError) && QFile::exists(m_pServer->serverName())){QFile::remove(m_pServer->serverName());m_pServer->listen(strServerName);}}}
}SingleApplication::~SingleApplication()
{//ShutDownLog4QtByCoding();   //exec()执行完成后,才关闭logger
}void SingleApplication::newLocalConnection()
{QLocalSocket *pSocket = m_pServer->nextPendingConnection();if (pSocket != NULL){pSocket->waitForReadyRead(1000);QTextStream in(pSocket);QString strValue;in >> strValue;qDebug() << QString("The value is: %1").arg(strValue);delete pSocket;pSocket = NULL;}
}bool SingleApplication::isRunning()
{return m_bRunning;
}int main(int argc, char *argv[])
{//不用原本的QApplication ,改为使用自定义的类//QApplication a(argc, argv);SingleApplication a(argc, argv);MainWindow w;w.show();return a.exec();;}

1.4 使用共享内存的方式实现单实例

我们可以使用共享内存的方式,实现一个简单的单实例,保证主程序的开启只有一份。

int main(int argc, char *argv[])
{QApplication a(argc, argv);// 创建一个唯一的共享内存段QSharedMemory sharedMemory("MyApp");if (!sharedMemory.create(1)) {// 共享内存已存在,说明应用程序已经在运行QMessageBox::information(nullptr, QStringLiteral("提示"), QStringLiteral("应用程序已经在运行!"));return 0;}MainWindow w;w.show();int result = a.exec();return result;}

二、心跳监护系统的架构设计

2.1 监护系统结构说明

  • 主进程(Main Process):应用程序的核心业务模块,负责向心跳服务注册自身状态。
  • 监护进程(Guardian Process):独立于主进程的守护程序,持续发送心跳信号。
  • 心跳服务(Heartbeat Service):中央协调者,监听所有节点状态,执行异常处理。

2.3 Qt实现的核心模块

服务端实现
class HeartbeatServer : public QObject {Q_OBJECT
public:explicit HeartbeatServer(quint16 port, QObject* parent=nullptr): QObject(parent), m_port(port) {m_udpSocket.bind(m_port);connect(&m_udpSocket, &QUdpSocket::readyRead,this, &HeartbeatServer::processDatagrams);m_checkTimer.start(1000); // 1秒检查间隔connect(&m_checkTimer, &QTimer::timeout,this, &HeartbeatServer::checkNodes);}private slots:void processDatagrams() {while(m_udpSocket.hasPendingDatagrams()) {QByteArray datagram;datagram.resize(m_udpSocket.pendingDatagramSize());QHostAddress sender;quint16 senderPort;m_udpSocket.readDatagram(datagram.data(), datagram.size(),&sender, &senderPort);if(validatePacket(datagram)) {m_nodes[sender.toString()] = QDateTime::currentDateTime();}}}void checkNodes() {auto now = QDateTime::currentDateTime();auto it = m_nodes.begin();while(it != m_nodes.end()) {if(it->secsTo(now) > TIMEOUT_THRESHOLD) {emit nodeTimeout(it.key());it = m_nodes.erase(it);} else {++it;}}}signals:void nodeTimeout(const QString& address);private:QUdpSocket m_udpSocket;QTimer m_checkTimer;QMap<QString, QDateTime> m_nodes;quint16 m_port;
};
客户端实现
class HeartbeatClient : public QObject {Q_OBJECT
public:explicit HeartbeatClient(const QHostAddress& serverAddr, quint16 port,QObject* parent=nullptr): QObject(parent), m_serverAddr(serverAddr), m_port(port) {m_timer.start(HEARTBEAT_INTERVAL);connect(&m_timer, &QTimer::timeout,this, &HeartbeatClient::sendHeartbeat);}private slots:void sendHeartbeat() {HeartbeatPacket packet;packet.timestamp = QDateTime::currentSecsSinceEpoch();packet.processId = QCoreApplication::applicationPid();packet.statusFlags = calculateStatus();packet.crc = calculateCRC(packet);QByteArray data(reinterpret_cast<char*>(&packet), sizeof(packet));m_udpSocket.writeDatagram(data, m_serverAddr, m_port);}private:QUdpSocket m_udpSocket;QTimer m_timer;QHostAddress m_serverAddr;quint16 m_port;
};

三、配置类的加载

3.1 分级配置体系设计

  • 系统级配置(/etc)
  • 用户级配置(~/.config)
  • 临时配置(内存存储)
  • 命令行覆盖配置
    如果时单个应用程序,往往一些简单的配置文件居多,即便这样,也建议做好配置类的管理和加载时的统筹规划设计。

3.2 分类加载

有时候一些配置类的文件或者字段,不是需要软件开启时就用的,这些配置,就可以延后加载,软件开启只加载跟开启有关的,必要的配置。

3.3 读写的控制

对于一些配置需要可读可写的情况,特别需要注意多线程情况下冲突,可以在处理配置文件或配置数据的读写上加锁,避免数据异常。比如:

QString ConfigControl::getWarnValue()
{//读写要加锁控制QMutexLocker locker(m_pMutex);return m_cfgParam->m_strWarningValue;
}
int ConfigControl::setWarnValue(const QString& str)
{//读写要加锁控制QMutexLocker locker(m_pMutex);m_cfgParam->m_strWarningValue = str;if(!Utils::util_setting::writeInit(QString(CONFIG_PATH_TARGET), QString("AppConfig"), QString("WarningValue"), str))return 1;return 0;
}

四、日志系统的及时介入

4.1 传统日志方案的瓶颈

虽然一些微小程序可以自己随便写个txt充当日志,但你就需要考虑以下这些问题:

  • 同步写操作的性能损耗
  • 多线程竞争问题
  • 日志丢失风险
  • 磁盘IO阻塞

4.2 log4qt日志库的使用

这里由于我最近都是做Qt的开发,习惯使用log4qt日志库。
这里点击获取log4qt库,包含源码,dll库和初始化配置代码

//这是为调用log4qt库写的初始化配置,
#include "log4qt/helper/log4qt_init_helper_by_coding.h"
#include "log4qt/include/log4qt/logger.h"   // 每个使用log4qt的类都需要包含此头文件// 在类的cpp文件中,使用此静态方法声明logger(此方法比较通用)
// 第二个参数写类名字,因此,输出的log条目中包含其对应的类名
LOG4QT_DECLARE_STATIC_LOGGER(logger, main)void setupLog()
{QString strLogPath = QCoreApplication::applicationDirPath() + "/Log";qDebug() << "logs path:" << strLogPath;SetupLog4QtByCodingWithLogSavingDirAbsPath(strLogPath);logger()->info() << __FUNCTION__ << ", logs path: " << strLogPath;
}int main(int argc, char *argv[])
{QApplication a(argc, argv);//设置日志setupLog();MainWindow w;w.show();int result = a.exec();// 关闭logger日志ShutDownLog4QtByCoding(); return result;}

五、启动画面的深度优化

有时候,我们不是简单的一个小程序,有可能我们得根据用户明确的目标:他们希望启动画面不仅美观,还要高效,减少启动时间,提升用户体验。可能的应用场景包括工业软件、医疗系统或其他需要快速启动的专业工具。这时候,就得在界面启动上下功夫,想一些解决方案了。
比如一些实现方法:多线程加载资源、使用OpenGL加速、进度条的设计等。

5.1 渐进式加载策略

比如我们设定程序开启后一些流程如下:

  1. start:显示静态LOGO;
  • fork:预加载核心字体;
  • fork again:初始化OpenGL上下文;
  • fork again :加载基础样式表;
  • end fork:显示进度条(30%);
  1. fork :异步加载业务模块;
  • fork again:建立数据库连接;
  • fork again :初始化网络组件;
  • end fork
  1. 显示进度条(70%);
  2. 完成剩余初始化;
  3. 进入主界面(100%);

比如通过线程池来加载一些资源:

class ResourceLoader : public QRunnable {QString m_resourcePath;QAtomicInt* m_progress;
public:ResourceLoader(const QString& path, QAtomicInt* progress) : m_resourcePath(path), m_progress(progress) {}void run() override {QImage img(m_resourcePath);QMetaObject::invokeMethod(qApp, [this, img](){QPixmap::fromImage(img); // 传递到主线程m_progress->fetchAndAddRelaxed(10);}, Qt::QueuedConnection);}
};// 启动加载任务
QThreadPool pool;
QAtomicInt progress(0);
pool.start(new ResourceLoader(":/images/bg.jpg", &progress));
pool.start(new ResourceLoader(":/icons/set1.png", &progress));
pool.start(new ResourceLoader(":/icons/set2.png", &progress));

5.2 硬件加速渲染

可以考虑以下几种方式:

5.2.1 OpenGL优化
class GLWidget : public QOpenGLWidget {
protected:void initializeGL() override {initializeOpenGLFunctions();glEnable(GL_BLEND);glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);}void paintGL() override {glClear(GL_COLOR_BUFFER_BIT);// 使用VBO绘制预加载的几何图形drawCachedGeometry();}private:GLuint m_vbo = 0;
};
5.2.2 多缓冲技术实现
class DoubleBufferSplash : public QSplashScreen {QPixmap m_frontBuffer;QPixmap m_backBuffer;QMutex m_mutex;public:void updateDisplay() {QMutexLocker locker(&m_mutex);qSwap(m_frontBuffer, m_backBuffer);setPixmap(m_frontBuffer);}void asyncRender() {QFuture<void> future = QtConcurrent::run([this](){QPainter painter(&m_backBuffer);renderComplexFrame(painter); // 后台渲染updateDisplay();});}
};
5.2.3 字体预处理优化
// 启动时预生成字体纹理
void preloadFontTextures() {QOpenGLTexture* texture = new QOpenGLTexture(QOpenGLTexture::Target2D);texture->setFormat(QOpenGLTexture::RGBA8_UNorm);QFont font("Arial", 12);QFontMetrics fm(font);QSize atlasSize(1024, 1024);QImage image(atlasSize, QImage::Format_RGBA8888);QPainter painter(&image);painter.setFont(font);// 生成常用字符集纹理for(int i=32; i<127; ++i) {QRect rect = fm.boundingRect(QChar(i));painter.drawText(rect, Qt::AlignLeft, QChar(i));}texture->setData(image);texture->generateMipMaps();
}

5.3 用户体验增强设计

5.3.1 初始化的进度进行智能预估
class ProgressEstimator {QVector<qint64> m_timeSamples;int m_currentStep = 0;public:void recordStepTime(qint64 ms) {m_timeSamples.append(ms);}int estimateRemaining() {if(m_timeSamples.isEmpty()) return 0;// 指数平滑预测double alpha = 0.2;double estimate = m_timeSamples.first();for(qint64 t : m_timeSamples) {estimate = alpha * t + (1 - alpha) * estimate;}return estimate * (TOTAL_STEPS - m_currentStep);}
};
5.3.2 友好型互动设计
void SafeSplashScreen::handleInitError(ErrorCode code) {switch(code) {case GPU_INIT_FAILED:showMessage(tr("正在切换软件渲染模式..."));disableHardwareAcceleration();break;case RESOURCE_LOAD_FAILED:showMessage(tr("使用备用资源继续加载..."));loadFallbackResources();break;case LICENSE_INVALID:QTimer::singleShot(2000, []{ QApplication::exit(EXIT_LICENSE); });break;}
}

5.4 性能优化指标体系

5.4.1 核心性能指标

一些性能指标参考
在这里插入图片描述

5.4.2 性能优化技巧

这里可以根据一些性能指标,使用一些方法进行相对的优化,比如:
预编译QML:使用qmlcachegen生成二进制缓存;
延迟加载策略:使用是写方法策略延迟加载部分暂不使用的模块(同上文);
资源压缩优化:比如对一些资源图片进行压缩处理,以优化加载和渲染时间;

最终,我们通过对程序开启时的一些操作,以及优化启动过程的"最后一公里"打磨,使应用程序在最大限度地满足需求。

相关文章:

Qt应用程序启动时的一些思路:从单实例到性能优化的处理方案

程序启动时优化的价值 在桌面软件开发领域&#xff0c;应用程序的启动过程就像音乐的序曲&#xff0c;决定了用户对软件品质的第一印象。比如首次启动等待超过3秒时&#xff0c;会让大多数用户产生负面看法&#xff0c;而专业工具软件的容忍阈值甚至更低。Qt框架作为跨平台开发…...

vue3父子组件传值

父 → 子&#xff1a;props 父组件 <template><ChildComponent :message"parentMessage" :user"user" /> </template><script setup> import ChildComponent from ./ChildComponent.vue; const parentMessage Hello from paren…...

中国品牌日 | 以科技创新为引领,激光院“风采”品牌建设结硕果

品牌&#xff0c;作为企业不可或缺的隐形财富&#xff0c;在当今竞争激烈的市场环境中&#xff0c;其构建与强化已成为推动企业持续繁荣的关键基石。为了更好地保护自主研发产品&#xff0c;激光院激光公司于2020年3月7日正式注册“风采”商标&#xff0c;创建拥有自主知识产权…...

合合信息上线智能文档处理领域首批MCP服务,助力企业快速搭建Agent

随着大模型及Agent技术的飞速发展&#xff0c;通过大模型调用外部工具正在成为AI应用开发的新范式。然而&#xff0c;由于不同大模型的调用结构和参数格式各异&#xff0c;开发者需要分别编写工具调用逻辑&#xff0c;AI工具集成效率低下&#xff0c;MCP&#xff08;Model Cont…...

佰力博科技与您探讨表面电阻的测试方法及应用领域

表面电阻测试是一种用于测量材料表面电阻值的技术&#xff0c;广泛应用于评估材料的导电性能、静电防护性能以及绝缘性能。 1、表面电阻的测试测试方法&#xff1a; 表面电阻测试通常采用平行电极法、同心圆电极法和四探针法等方法进行。其中&#xff0c;平行电极法通过在试样…...

【DeepSeek】判断两个 PCIe 设备是否属于**同一个 PCIe 子树

在 Linux 系统中&#xff0c;判断两个 PCIe 设备是否属于**同一个 PCIe 子树&#xff08;Subtree&#xff09;**是 P2P 通信的关键前提。以下是具体方法和步骤&#xff1a; 一、基本原理 两个 PCIe 设备属于同一子树的条件&#xff1a; 共享同一 Root Port&#xff1a;它们的…...

一份完整的高级前端性能优化手册

以下是一份完整的高级前端性能优化手册,涵盖核心原理、关键指标、优化策略及工具链,适合中大型项目深度优化: 高级前端性能优化手册 🚀 以用户体验为核心的极致性能实践 一、性能指标体系与度量 1. 核心性能指标 (Core Web Vitals) LCP (Largest Contentful Paint):最大…...

Leetcode 3543. Maximum Weighted K-Edge Path

Leetcode 3543. Maximum Weighted K-Edge Path 1. 解题思路2. 代码实现 题目链接&#xff1a;3543. Maximum Weighted K-Edge Path 1. 解题思路 这一题思路上就是一个遍历的思路&#xff0c;我们只需要考察每一个节点作为起点时&#xff0c;所有长为 k k k的线段的长度&…...

agentmain对业务的影响

前面一篇已经说了java agent技术主要有premain和agentmain两种形式&#xff0c;如果大部分业务已经在线上运行的话&#xff0c;不方便用premain的方式来实现&#xff0c;所以agentmain的方式是更加通用、灵活的 由于RASP是与用户业务运行在同一个jvm中的 &#xff0c;所以RASP…...

【前端】【JavaScript】【总复习】四万字详解JavaScript知识体系

JavaScript 前端知识体系 &#x1f4cc; 说明&#xff1a;本大纲从基础到高级、从语法到应用、从面试到实战&#xff0c;分层级讲解 JavaScript 的核心内容。 一、JavaScript 基础语法 1.1 基本概念 1.1.1 JavaScript 的发展史与用途 1. 发展简史 1995 年&#xff1a;JavaS…...

开源模型应用落地-qwen模型小试-Qwen3-8B-融合VLLM、MCP与Agent(七)

一、前言 随着Qwen3的开源与技术升级,其在企业中的落地场景正加速拓展至多个垂直领域。依托Agent智能体能力 和MCP协议的工具调用接口 ,Qwen3可深度融入企业业务流程,为企业提供从需求解析到自动化开发的全链路支持。 本篇将介绍如何实现Qwen3-8B模型集成MCP实现智能体交互。…...

【Linux学习笔记】理解一切皆文件实现原理和文件缓冲区

【Linux学习笔记】理解一切皆文件实现原理和文件缓冲区 &#x1f525;个人主页&#xff1a;大白的编程日记 &#x1f525;专栏&#xff1a;Linux学习笔记 前言 哈喽&#xff0c;各位小伙伴大家好!上期我们讲了重定向 今天我们讲的是理解一切皆文件实现原理和文件缓冲区。话不…...

MCP-RAG 服务器:完整设置和使用指南

在快速发展的人工智能应用时代&#xff0c;结合静态领域知识和实时网络信息的系统需求比以往任何时候都更加迫切。传统的检索增强生成&#xff08;RAG&#xff09;模型通常依赖于预先索引的数据&#xff0c;这限制了它们对新发展的反应能力。MCP-RAG Server通过将基于语义的向量…...

裸金属服务器 VS 传统物理机

一&#xff1a;首先&#xff0c;我们先介绍一下&#xff0c;什么是裸金属服务器&#xff1f; 1.虚拟机的外表-平台可视化 可以通过后台管理界面查看当前所使用的全部信息包括&#xff1a;当前系统版本、CPU、内存、硬盘等相关信息。 2.虚拟机的外表-操作自动化 同样也可以在…...

React百日学习计划-Grok3

关键点 研究表明&#xff0c;100天内学习React是可行的&#xff0c;尤其是你已有HTML、JS和CSS基础。该计划包括基础知识、hooks、状态管理、路由、样式化及综合项目&#xff0c;适合初学者。建议每天花2-3小时学习&#xff0c;结合免费教程和社区支持。 开始学习 学习React…...

Android NDK 高版本交叉编译:为何无需配置 FLAGS 和 INCLUDES

引言&#xff1a;NDK 交叉编译的演进 Android NDK&#xff08;Native Development Kit&#xff09;是开发高性能C/C代码的核心工具链&#xff0c;而交叉编译&#xff08;在x86主机上生成ARM架构代码&#xff09;一直是NDK的核心功能。过去&#xff0c;开发者需要手动配置大量编…...

Java详解LeetCode 热题 100(15):LeetCode 189. 轮转数组(Rotate Array)详解

文章目录 1. 题目描述2. 理解题目3. 解法一&#xff1a;使用额外数组3.1 思路3.2 Java代码实现3.3 代码详解3.4 复杂度分析3.5 适用场景 4. 解法二&#xff1a;环状替换法&#xff08;原地算法&#xff09;4.1 思路4.2 Java代码实现4.3 代码详解4.4 复杂度分析4.5 陷阱与注意事…...

出于PCB设计层面考虑,连排半孔需要注意哪些事项?

通过拼接作为后处理运行&#xff0c;用拼接联排半孔填充铜的自由区域。为了使通缝成为可能&#xff0c;必须在不同的层上有重叠的铜区域连接到指定的网上。铜的支持区域包括填充、多边形和动力平面。 高电流对电路板的潜在负面影响的另一个例子是电路板结构的物理失效。制造原始…...

JIT+Opcache如何配置才能达到性能最优

首先打开php.ini文件&#xff0c;进行配置 1、OPcache配置 ; 启用OPcache opcache.enable1; CLI环境下启用OPcache&#xff08;按需配置&#xff09; opcache.enable_cli0; 预加载脚本&#xff08;PHP 7.4&#xff0c;加速常用类&#xff09; ; opcache.preload/path/to/prel…...

VR和眼动控制集群机器人的方法

西安建筑科技大学信息与控制工程学院雷小康老师团队联合西北工业大学航海学院彭星光老师团队&#xff0c;基于虚拟现实&#xff08;VR&#xff09;和眼动追踪技术实现了人-集群机器人高效、灵活的交互控制。相关研究论文“基于虚拟现实和眼动的人-集群机器人交互方法” 发表于信…...

LabVIEW与PLC通讯程序S7.Net.dll

下图中展示的是 LabVIEW 环境下通过调用S7.Net.dll 组件与西门子 PLC 进行通讯的程序。LabVIEW 作为一种图形化编程语言&#xff0c;结合S7.Net.dll 的.NET 组件优势&#xff0c;在工业自动化领域中可高效实现与 PLC 的数据交互&#xff0c;快速构建工业监控与控制应用。相较于…...

【华为】现场配置OSPF

原创&#xff1a;厦门微思网络 实验目的 1、了解OSPF的运行原理 2、掌握OSPF的配置方法 实验拓扑 实验需求 1、根据实验拓扑图&#xff0c;完成设备的基本配置&#xff1b; 2、分别在R1、R2、R3上创建Loopback0接口&#xff0c;IP地址分别是1.1.1.1/32、2.2.2.2/32、3.3.3.…...

STM32-DMA数据转运(8)

目录 一、简介 二、存储器映像 三、DMA框图​编辑 四、DMA基本结构 五、两个数据转运的实例 一、简介 直接存储器存取简称DMA&#xff08;Direct Memory Access&#xff09;&#xff0c;它是一个数据转运小助手&#xff0c;主要用来协助CPU&#xff0c;完成数据转运的工作…...

课题推荐——低成本地磁导航入门,附公式推导和MATLAB例程运行演示

地磁导航利用地球磁场的自然特性&#xff0c;通过感知磁场变化&#xff0c;帮助机器人或无人设备实现定位和导航。相比于 GPS、激光雷达等导航方法&#xff0c;地磁导航具有以下优势&#xff1a; 低成本&#xff1a;使用地磁传感器&#xff08;如电子罗盘&#xff09;&#xff…...

微信小程序学习之底部导航栏

首先&#xff0c;我们在app.json中添加4个页面&#xff0c; "pages": ["pages/index/index","pages/category/category","pages/cart/cart","pages/user/user"], 其次我们把8张图片放到imaes文件夹下&#xff0c; 图标可…...

c++ std库中的文件操作学习笔记

1. 概述 C标准库提供了 头文件中的几个类来进行文件操作&#xff0c;这些类封装了底层的文件操作&#xff0c;提供了面向对象和类型安全的接口&#xff0c;使得文件读写更加便捷和高效。主要的文件流类包括&#xff1a; std::ifstream&#xff1a;用于从文件中读取数据。 st…...

多臂赌博机:探索与利用的平衡艺术

1. 引言 在机器学习领域&#xff0c;多臂赌博机&#xff08;Multi-Armed Bandit&#xff0c;MAB&#xff09;问题是强化学习的一个经典且基础的模型。这个名称源于赌场中的"单臂老虎机"&#xff08;One-armed Bandit&#xff09;&#xff0c;因为这种赌博机器像强盗…...

分布式异步强化学习框架训练32B大模型:INTELLECT-2

INTELLECT-2 模型详解 一、模型概述 INTELLECT-2 是一个拥有 320 亿参数的语言模型&#xff0c;其训练采用了一种创新的方式&#xff0c;即通过社区贡献的分布式、无需许可的 GPU 资源进行强化学习训练。该模型基于 qwen2 架构构建&#xff0c;因此与 vllm 或 sglang 等流行库…...

HTML应用指南:利用POST请求获取全国京东快递服务网点位置信息

京东快递作为中国领先的智能供应链与综合物流服务提供商,自2007年成立以来,始终致力于通过技术创新与高效运营,为客户提供安全、可靠、快速的物流解决方案。京东快递依托京东集团的强大资源支持,凭借其自营仓储、干线运输、末端配送一体化的物流网络,在激烈的市场竞争中脱…...

通过POI实现对word基于书签的内容替换、删除、插入

一、基本概念 POI&#xff1a;即Apache POI&#xff0c; 它是一个开源的 Java 库&#xff0c;主要用于读取 Microsoft Office 文档&#xff08;Word、Excel、PowerPoint 等&#xff09;&#xff0c;修改 或 生成 Office 文档内容&#xff0c;保存 为对应的二进制或 XML 格式&a…...

git进行版本控制时遇到Push cannot contain secrets的解决方法

git进行版本控制&#xff0c;push遇到Push cannot contain secrets的解决方法 最近在项目开发过程中&#xff0c;我遇到了一个让我头疼不已的问题。 问题的出现 一开始&#xff0c;我的项目远程仓库连接的是 Gitee&#xff0c;在开发过程中一切都很顺利&#xff0c;我也习惯…...

Java GUI 开发之旅:Swing 组件与布局管理的实战探索

在编程的世界里&#xff0c;图形用户界面&#xff08;GUI&#xff09;设计一直是提升用户体验的关键环节。Java 的 Swing 库为我们提供了强大的工具来构建跨平台的 GUI 应用。今天&#xff0c;我将通过一次实验&#xff0c;分享如何使用 Java Swing 开发一个功能丰富的 GUI 应用…...

OpenVLA (2) 机器人环境和环境数据

文章目录 前言1 BridgeData V21.1 概述1.2 硬件环境 2 数据集2.1 场景与结构2.2 数据结构2.2.1 images02.2.2 obs_dict.pkl2.2.3 policy_out.pkl 前言 按照笔者之前的行业经验, 数据集的整理是非常重要的, 因此笔者这里增加原文中出现的几个数据集和环境的学习 1 BridgeData V…...

【Ansible】基于windows主机,采用NTLM+HTTPS 认证部署

我们现在准备Linux centos7&#xff08;Ansible控制机&#xff09;和Windows&#xff08;客户机&#xff09;环境下的详细部署步骤&#xff1a; 一、Windows客户机配置 1. 准备SSL证书 1.1 生成自签名证书&#xff08;测试用&#xff09; 以管理员身份打开PowerShell&#…...

React19源码系列之 API(react-dom)

API之 preconnect preconnect – React 中文文档 preconnect 函数向浏览器提供一个提示&#xff0c;告诉它应该打开到给定服务器的连接。如果浏览器选择这样做&#xff0c;则可以加快从该服务器加载资源的速度。 preconnect(href) 一、使用例子 import { preconnect } fro…...

鸿蒙Next开发 获取APP缓存大小和清除缓存

1. 鸿蒙Next开发 获取APP缓存大小和清除缓存 1.1. 介绍 1.1.1. 文件系统分类 在最新的Core File Kit套件中&#xff0c;按文件所有者的不同。分为如下三类&#xff1a;   &#xff08;1&#xff09;应用文件&#xff1a;文件所有者为应用&#xff0c;包括应用安装文件、应用…...

PNG转ico图标(支持圆角矩形/方形+透明背景)Python脚本 - 随笔

摘要 在网站开发或应用程序设计中&#xff0c;常需将高品质PNG图像转换为ICO格式图标。本文提供一份基于Pillow库实现的&#xff0c;能够完美保留透明背景且支持导出圆角矩形/方形图标的格式转换脚本。 源码示例 圆角方形 from PIL import Image, ImageDraw, ImageOpsdef c…...

『大模型笔记』Langchain作者Harrison Chase专访:环境智能体与全新智能体收件箱

Langchain作者Harrison Chase专访:环境智能体与全新智能体收件箱 文章目录 摘要访谈内容什么环境智能体为什么要探索环境智能体怎么让人类能更方便地和环境智能体互动参考文献摘要 LangChain 的 CEO Harrison Chase 提出了_“环境智能体”(Ambient Agents)的概念,这是一种…...

GPT( Generative Pre-trained Transformer )模型:基于Transformer

GPT是由openAI开发的一款基于Transformer架构的预训练语言模型&#xff0c;拥有强大的生成能力和多任务处理能力&#xff0c;推动了自然语言处理&#xff08;NLP&#xff09;的快速发展。 一 GPT发展历程 1.1 GPT-1&#xff08;2018年&#xff09; 是首个基于Transformer架构…...

游戏引擎学习第275天:将旋转和剪切传递给渲染器

回顾并为今天的内容定下基调 我们认为在实现通用动画系统之前&#xff0c;先学习如何手写动画逻辑是非常有价值的。虽然加载和播放预设动画是合理的做法&#xff0c;尤其是在团队中有美术人员使用工具制作动画的情况下更是如此&#xff0c;但手动编写动画代码能让我们更深入理…...

conda 输出指定python环境的库 输出为 yaml文件

conda 输出指定python环境的库 输出为 yaml文件。 有时为了项目部署&#xff0c;需要匹配之前的python环境&#xff0c;需要输出对应的python依赖库。 假设你的目标环境名为 myenv&#xff0c;运行以下命令&#xff1a; conda env export -n myenv > myenv_environment.ym…...

ES6 语法

扩展运算符 … 口诀&#xff1a;三个点&#xff0c;打散数组&#xff0c;逐个放进去 例子&#xff1a; let arr [1, 2];let more [3, 4];arr.push(...more); // arr 变成 [1, 2, 3, 4]解构赋值 口诀&#xff1a;左边是变量&#xff0c;右边是值&#xff0c;一一对应 例子&…...

BFS算法篇——打开智慧之门,BFS算法在拓扑排序中的诗意探索(下)

文章目录 引言一、课程表1.1 题目链接&#xff1a;https://leetcode.cn/problems/course-schedule/description/1.2 题目分析&#xff1a;1.3 思路讲解&#xff1a;1.4 代码实现&#xff1a; 二、课程表||2.1 题目链接&#xff1a;https://leetcode.cn/problems/course-schedul…...

While语句数数字

import java.util.Scanner;public class Hello {public static void main(String[] args) {Scanner in new Scanner(System.in);int number in.nextInt();int count 0;while( number > 0 ){number number / 10;count count 1;}System.out.println(count);} }...

G1JVM内存分配机制详解

为什么堆内存不是预期的3G&#xff1f; 当您设置-XX:MaxRAMPercentage75时&#xff0c;JVM并不会简单地将容器内存(4G)的75%全部分配给堆&#xff0c;原因如下&#xff1a; 计算基准差异&#xff1a; 百分比是应用于"可用物理内存"而非"容器总内存" &q…...

“端 - 边 - 云”三级智能协同平台的理论建构与技术实现

摘要 随着低空经济与智能制造的深度融合&#xff0c;传统集中式云计算架构在实时性、隐私保护和资源效率上的瓶颈日益凸显。本文提出“端 - 边 - 云”三级智能协同平台架构&#xff0c;以“时空 - 资源 - 服务”三维协同理论为核心&#xff0c;构建覆盖终端感知、边缘计算、云端…...

【UAP】《Empirical Upper Bound in Object Detection and More》

Borji A, Iranmanesh S M. Empirical upper bound in object detection and more[J]. arXiv preprint arXiv:1911.12451, 2019. arXiv-2019 文章目录 1、Background and Motivation2、Related Work3、Advantages / Contributions4、Experimental Setup4.1、Benchmarks Dataset…...

Web Service及其实现技术(SOAP、REST、XML-RPC)介绍

一.概述 1.Web Service&#xff08;Web 服务&#xff09; Web Service 由万维网联盟 (W3C) 定义为一种软件系统&#xff0c;旨在支持通过网络进行可互操作的计算机间交互。 广义概念&#xff1a;基于 Web 技术&#xff08;如 HTTP 协议&#xff09;的跨平台、跨语言通信机制…...

基于Spring Boot+Layui构建企业级电子招投标系统实战指南

一、引言&#xff1a;重塑招投标管理新范式 在数字经济浪潮下&#xff0c;传统招投标模式面临效率低、透明度不足、流程冗长等痛点。本文将以Spring Boot技术生态为核心&#xff0c;融合Mybatis持久层框架、Redis高性能缓存及Layui前端解决方案&#xff0c;构建一个覆盖招标代理…...

【嵌入式】记一次解决VScode+PlatformIO安装卡死的经历

PlatformIO 是开源的物联网开发生态系统。提供跨平台的代码构建器、集成开发环境&#xff08;IDE&#xff09;&#xff0c;兼容 Arduino&#xff0c;ESP8266和mbed等。 开源库地址&#xff1a;https://github.com/platformio 在 VScode 中配置 PlatformIO 插件&#xff0c;记录…...