自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(106)
  • 问答 (1)
  • 收藏
  • 关注

原创 3分钟用C语言教你写个‘浪漫烟花‘---特别漂亮

文章目录开发工具效果展示总体框架逻辑关系源代码素材总结开发工具vs2019(vs系列都可以),easyx图形库(特别小),官网下载效果展示动态图总体框架/****************************************** 项目名称:浪漫烟花* 项目描述:贴图* 项目环境:vs2019* 生成日期:2020-9-7* 作者所属:追梦***********

2020-09-07 16:08:33 53165 149

原创 Java基础知识笔记(详细)

文章目录集成开发环境创建项目编写程序运算符控制台输入IDEA的常用快捷键集成开发环境IDEA是一个专门针对Java的集成开发工具(IDE),由Java语言编写。所以,需要有JRE运行环境并配置好环境变量。它可以极大地提升我们的开发效率。可以自动编译,检查错误。创建项目创建项目-创建模块-创建包-创建类(1)创建一个工程(2)jdk版本我这里是1.7的(3)我命名为java_Web(4)创建一个Module我命名为day01(5)创建包和类编写程序Java第一个程序pac

2020-06-09 10:19:29 30814 52

原创 qmake / jom / 影子构建:把编译管起来

本文聚焦于如何有效管理 Qt 项目编译过程,解决源码目录被中间文件污染、无法并行构建及跨环境复现等问题。通过使用 qmake 生成 Makefile 并结合 jom 实现多核并行编译,推行影子构建(Shadow Build)保持源码整洁,实现 Debug/Release 多版本共存与一键清理。强调命令行脚本化构建的重要性,避免依赖 IDE 手动操作,并提醒需在修改 .pro 后重新执行 qmake。最后介绍生成 Visual Studio 工程的便捷方式,为工程化奠定基础。

2026-10-06 11:45:00 206

原创 目录约定、构建集成与版本发布

本文总结了插件化系统的三大核心约定:目录结构统一(插件分目录存放,含元数据)、构建与版本管理规范(共享SDK、模块化编译、接口版本向后兼容)、发布清单严格校验(依赖、版本、加载顺序等)。通过固化流程,解决新同事上手难、构建混乱、热替换失败等问题,实现插件系统可维护、可扩展、可发布。核心在于守住边界,只传递安全数据,以纪律替代风险。

2026-10-05 09:00:00 8

原创 崩溃隔离——一个插件挂了,不能带崩宿主

插件崩溃在同进程内无法通过 try/catch 防止,因段错误、abort 等非异常问题会直接终止进程。真正隔离需进程外设计(IPC),虽性能损耗大但安全;可信插件可采用同进程+防御式编程,通过契约约束与测试降低风险。决策应基于插件可信度与场景:不可信者必进程隔离,高性能需求者权衡取舍,核心逻辑始终保留在宿主。最终,崩溃隔离是架构选择,而非代码技巧。

2026-10-04 10:00:00 12

原创 插件的单元测试与契约测试

插件测试需兼顾单元测试与契约测试:单元测试通过真实宿主加载编译产物,验证功能实现;契约测试则确保插件遵守接口版本、元数据及行为约定,捕获“宿主升级而插件未更新”的风险。二者分工明确,分别由插件与SDK维护者负责,共同保障插件生态的稳定性。

2026-10-03 09:45:00 42

原创 加载失败诊断——从 errorString 到 Dependencies

本文提供一套从浅到深的Qt插件加载失败诊断流程:依次检查文件存在性与格式、Qt加载错误信息、元数据(IID/版本)一致性、依赖库缺失(用dumpbin或Dependencies工具)、位数与运行时匹配问题。强调在干净环境复现、比对编译选项,并建议将路径、错误信息、元数据等关键线索写入日志,实现高效定位,告别“本地能跑”的盲目猜测。

2026-10-01 09:00:00 13

原创 Qt5.12 + MSVC2017 环境搭建:我重装了三次才顺,这 8 个坑你不用再踩

本文分享Qt 5.12.11 + MSVC2017环境下从零搭建开发环境的8大实战坑点:编译器识别失败、32/64位缺失、nmake效率低、__cplusplus宏错误、Debug运行库缺失、Release无调试信息、windeployqt误判第三方依赖、路径含中文空格导致构建失败。作者通过三次重装血泪经验,总结出完整配置清单与解决方案,强调环境一致性、使用jom并行构建、正确设置/Zc:__cplusplus、发布Release版、确保windeployqt与编译工具链匹配、路径纯英文等关键实践,为交付稳

2026-09-30 14:20:28 449

原创 热加载落地——影子拷贝 + 双缓冲 + 状态迁移

本文总结了实现热替换插件的完整流程:通过影子拷贝避免文件锁定,双缓冲机制确保服务不中断,状态迁移保障数据连续性,并结合原子切换与严格回滚策略,最终构建出一套稳定、无停机的热更新系统。该方案需从接口设计到资源管理全程遵循可序列化、无共享状态等原则,适用于对可用性要求极高的长期运行系统。

2026-09-30 08:00:00 4

原创 静态对象、线程与“卸了还在跑的代码“

插件热卸载的关键在于确保无任何线程在执行其代码。核心是“线程 draining”:通过原子标志通知工作线程停止,阻塞等待其退出(wait()),超时则放弃卸载以保进程安全。避免使用跨模块全局/静态对象及 thread_local,防止析构时访问已卸载的 DLL。只有线程真正结束、对象析构完毕后,才能安全调用 FreeLibrary。至此,热加载四大前提全部闭环,为完整热替换流程奠定基础。

2026-09-29 09:00:00 4

原创 信号槽——自动断开不够用

热卸载中,Qt 的自动断开机制无法处理已排队的跨线程信号。为确保安全,需建立显式连接登记表,卸载前先断开所有连接、排空事件队列,再同步删除对象并卸载DLL。插件teardown()须主动断开自身外部连接,禁用deleteLater(),严格遵循“断连→清队列→删对象→卸载”顺序,彻底消除悬空连接与待处理事件,保障热卸载可靠性。

2026-09-28 08:30:31 8

原创 QObject 树与所有权——卸载前必须断开的

插件卸载前必须彻底清理其创建的 QObject,否则会因虚函数调用或析构时访问已释放的 DLL 代码而崩溃。关键在于:先 setParent(nullptr) 解除宿主树关系,再同步 delete,禁用 deleteLater() 以防事件队列残留。宿主应通过引用计数管理插件对象持有状态,确保无残留后方可卸载,并辅以断言检查,保障热卸载安全。

2026-09-24 14:11:57 7

原创 热加载为什么难——卸载 DLL 的四个前提

进入阶段三,核心挑战是不停机热卸载插件。QPluginLoader::unload() 默认返回 false,因 Qt 5.7 起默认启用 PreventUnloadHint,需在 load() 前移除该提示。此外,必须确保无其他 QPluginLoader 实例引用、插件创建的 QObject 已删除并脱离宿主树、所有信号连接断开且事件队列清空、后台线程已 join 完毕。四者缺一不可,否则 FreeLibrary 将引发崩溃。建议先评估是否真需热加载——若重启可接受,可跳过复杂管理。

2026-09-23 17:21:17 6

原创 配置注入——插件怎么拿到自己的配置

插件配置应由宿主注入,而非自行读取全局设置。通过为每个插件创建独立的 QSettings 作用域(如 beginGroup(pluginId)),实现键名隔离,避免冲突。推荐将配置作为校验后的 QVariantMap 注入,并让插件声明 configSchema,宿主负责验证与填充默认值,确保配置可测、可复现。禁止注入活对象,仅传递数据;运行时变更通过专用信号通知,保持插件独立性。此举统一了“边界”原则:宿主主动提供、插件被动接收、过界数据可校验,为插件化系统奠定稳定基础。

2026-09-22 13:15:00 6

原创 生命周期状态机

本文提出用六态状态机管理插件生命周期,解决加载成功但不可用、热更新冲突及并发访问已卸载内存等问题。核心是区分“已加载”与“可使用”,通过引用计数和状态守卫确保安全卸载。关键状态包括 Ready(就绪)、InUse(被引用)、Unloading(卸载中),并强制要求引用必须显式 acquire/release。状态机不仅防止崩溃,更为热加载铺路,使依赖关系可视化,提升系统可维护性与调试效率。

2026-09-21 19:16:19 150

原创 初始化顺序与依赖拓扑

到目前为止,我们假设插件加载进来就能用。真实项目里不是。插件之间往往有依赖:我们示例工程里(导出工具)要等数据模型建好才能用,而数据模型是导进来的;(图表面板)要展示这份数据,也得排在 importer 后面。加载顺序排错了,就会出现"插件 A 初始化时去拿 B 还没建好的东西",要么拿到空指针崩,要么静默拿到半成品。这种事不能靠"我手动按 1、2、3 排",因为插件是别人写的、会增减、会换依赖。得让依赖关系可声明、可计算。

2026-09-21 10:00:00 9

原创 工厂与注册——插件怎么交出类型

插件加载成功只是第一步。紧接着的问题是:宿主怎么知道"这个插件能造什么"?只给你一个QObject*,你成某个已知接口,能用。但如果插件要提供的不是"一个服务",而是"一组可创建的类型"——比如 importer 插件支持 csv、tsv、xlsx 三种格式,每种都是一个独立的IImporter实例——那instance()返回的单例根对象就不够用了。你需要工厂。

2026-09-20 21:30:01 16

原创 不用 Qt 也能做——QLibrary 直连

好用,但它要求插件也是 Qt 程序(得有Q_OBJECT、moc、元对象系统那一套)。.dll这些情况QLibrary就够了。文档自己也说了,它相比QLibrary多给的就是"Qt 版本检查"和"直接拿根对象",如果你不需要这两样,直连QLibrary更轻。

2026-09-17 21:29:17 36

原创 QPluginLoader 到底替你做了什么

前面几天都在讲规矩,今天第一次把拆开看。很多人用它是因为"Qt 说这么用",但不知道它底下到底干了哪几件事。不清楚这几件事,遇到加载失败就只能对着那句发呆。我以前就是。第一次加载失败,我,打出来一句 “The plugin … uses incompatible Qt library”,愣了半天——这到底是哪一步失败的?是文件没找到,还是 Qt 版本不对,还是我接口写错了?把流程拆开,这些事就清楚了。

2026-09-16 20:48:11 5

原创 宿主与插件,谁拥有谁

Day 04 里那句,我故意没展开。因为imp这个指针的生命周期,是整个插件系统里最容易出诡异 bug 的地方。问题很简单:插件加载成功后,出来的那个IImporter*,到底归谁管?宿主能直接delete吗?delete。

2026-09-15 08:00:38 13

原创 插件描述文件——元数据、IID 与版本校验

我第一次做版本校验,是放在load()之后的。逻辑大概是:先加载,再检查插件返回的版本号,不对就报错。听起来没毛病。结果线上出过一个事故:有个插件是用旧 SDK 编的,它在静态初始化阶段(就是 DLL 被那一刻执行的那些全局构造)就崩了。我连load()的返回值都没拿到,宿主直接跟着一起没了。。加载本身是有代价的,而且是不可逆的——一旦进去了,你就在人家的代码里了。怎么在不加载的前提下知道一个插件是什么?靠元数据。

2026-09-14 12:48:42 21

原创 导出符号——MSVC 那堆 C4251 警告从哪来

我们团队有个插件项目,在 Linux 上编译通过、跑得很好,一拿到 Windows 上,链接期直接一串。同一份代码,没有平台相关分支。原因是 MSVC 和 GCC 在符号可见性上的默认行为所以在 Linux 上你什么都不用做,动态库里的类和函数对外都可见;到了 Windows,一个都不导出,宿主链接时就找不到符号。这个差异也是为什么很多开源项目在 Windows 上要专门加一套*_EXPORT宏。

2026-09-13 09:26:51 17

原创 接口怎么设计,一年后还能改

Day 01 定下来的IImporter用了半年,运行良好。然后产品提了两个需求:导入要能显示进度,要能取消。重编宿主,重编所有插件,跑通了,收工。半年后客户报告:升级了主程序、没升级某个第三方插件,导入功能一点就崩。

2026-09-12 09:06:23 15

原创 Day 01:插件化之前,先看清 ABI 这堵墙

想把一个单体桌面程序改成插件化,动机通常很朴素:改一行代码要重编十分钟、几个小组在同一个解决方案里互相踩、客户想加个功能得等我们发版、以及少数时候想不停机换模块。这些诉求插件化都能解。但在设计第一个接口之前,有一堵墙必须先看清楚,不然写完的东西能在你机器上跑,到别人机器上就是随机崩溃。这堵墙叫 ABI。

2026-09-11 20:36:54 28

原创 UDP 发送端不需要 bind —— 纠正我四年前的一个错误回答

2022 年在 CSDN 问答区看到一个问题:「QT 中 UDP 怎么绑定发送端口」。后来提问者追了一句「不生效」,我支支吾吾没答上来,这事儿就过去了。这四年我一直以为那个回答本身是对的,只是细节没说清。最近翻 Qt 文档才反应过来——。不是代码写错了,是这个问题的前提就不成立。Qt 文档QUdpSocket的 Detailed Description 里写得明明白白:所以「绑定发送端口」这个说法本身就是个伪需求。发送端口不需要你管。

2026-09-10 20:42:45 352

原创 数据库操作QTableView保存小数点的位数

QTableView表格控件代理

2022-08-10 22:52:39 2171 1

原创 qt入门--网络编程

文章目录一、演示demo1.1代码示例1.1.1 h头文件1.1.2 cpp文件1.2 代码详解二、主机信息一、演示demo1.1代码示例1.1.1 h头文件#ifndef FORM_H#define FORM_H#include <QWidget>#include "TitleBar/basewidget.h"#include "TitleBar/commonhelp.h"#include<QAbstractSocket>#include<QHo

2022-02-26 11:43:27 1258

原创 项目视图以及项目小部件的基本用法(View表和Widget表)

文章目录总结一些常用tabe表的用法QListWidget的用法void TableWidget::initListWidget(){ //插入方法1 ui->listWidget->addItem("Program Files"); //插入方法2 QListWidgetItem* pInsertItem = new QListWidgetItem(); pInsertItem->setText("Program Files(x64)

2022-01-16 11:25:42 915

原创 qt万能样式表模板

文章目录一、效果二、样式代码三,加载样式表在项目开发过程中,不可缺少的一部分就是界面的美化,软件做的怎么样,界面风格样式很重要。在qt中通过样式表,*.qss文件加载到程序中美化界面一、效果二、样式代码代码如下:QWidget{ color: rgb(255, 255, 255); /*字体颜色*/ background-color: rgb(3,21,106); /*背景色*/}/*按钮正常状态*/QPushButton{ background-col

2022-01-09 10:56:47 9276 10

原创 2022年第一篇C语言50行代码制作爱心电子相册

文章目录介绍效果展示源代码素材总结介绍去年看到过,今天突然想到,记录下来。给初学者留个好印象。关于开发工具------浪漫烟花文章有介绍效果展示动态图源代码#include<easyx.h>#include<stdio.h>#include<time.h>#include"mmsystem.h"#pragma comment(lib,"winmm.lib")struct Point //位置{ int x; int y;};IMAG

2022-01-01 12:09:33 12889 1

原创 Qt入门------数据库操作

文章目录一、数据库1.数据库驱动2.查询驱动3.连接数据库4.执行sql语句5.插入数据6.事务二 ,模块类一、数据库Qt中的Qt SQL模块提供了对数据库的支持,模块中类可分为三层:驱动层,sql接口层,用户层。驱动层:(QSqlDriver,QSqlDriverCreator,QSqlDriverCreatorBase,QSqlDriverPlugin)为具体的数据库和SQL接口层之间提供了底层的桥梁;SQL接口层:(QSqlDatabase,QSqlQuery,QSqlError,QSql

2021-12-31 15:34:07 17935 2

原创 智能商场管理系统(可当做毕设)

本次使用QtCreator开发,在项目开发过程中使用到有技术:数据库技术:连接数据库,通过界面操作实现对数据的增加,删除,修改,查看等相应功能。网络通信技术,服务器和客户端建立连接,读写发送数据。视频播放器,创建视频播放器,以及摄像头和捕捉画面。

2021-12-22 23:23:13 13239 9

原创 Qt5.9.7连接MySQL8.0出现mysql dirver not load(已解决)

在使用Qt开发过程中,需要连接MySQL,有时会遇到MYSQL driver not load 的错误,网上一大堆说的是把MySQL安装的目录下找到libmysql.dll拷贝到Qt的安装路径下面(我的Qt路径D:\software\Qt5.9\5.9.7\mingw53_32\bin),拷贝到下面之后,依旧还是MYSQL driver not load 的错误错误原因1.查看Qt版本Qt是32位的2.查看MYSQL版本未找到,需要配置MySQL环境变量默认安装路径 C:\Progr

2021-12-17 22:15:25 1294

原创 毕业设计酒店系统的开发

功能需求主要包括两个大类,分别为管理后台数据库和管理旅客住宿情况。数据库后台管理:存储全部数据。旅客住宿情况部分:用户操作和管理员操作界面,是程序设计的核心模块。具体功能如下:用户在程序内登录后,能线上预定客房,之后也能查看预定信息。当用户预订后,管理员可以从预订单信息表中获取到用户的一些基本信息,来提高入住登记的速度。用户也可以在软件中提前浏览该房间的图片和了解房型价格,线上了解详情更加便捷高效。管理员对房间有增删改查等权限。业务流程分析解读系统组织结构和功能作用时,最好的方案是考虑到实际业务流程,

2021-12-05 08:36:36 1638 1

原创 C++指针的处理

文章目录构造 函数可以抛出异常吗,有什么问题?初始化列表的异常怎么捕获?析构函数可以抛出异常吗,有什么问题?析构函数如何处理异常智能指针内存泄漏野指针强制转换RTTIRAIICPP11新特性仿函数构造函数可以抛出异常吗,有什么问题?构造函数中应该避免抛出异常。构造函数中抛出异常后,对象的析构函数将不会被执行构造函数抛出异常时,本应该在析构函数中被delete的对象没有被delete,会导致内存泄露当对象发生部分构造时,已经构造完毕的子对象(非动态分配)将会逆序

2021-06-11 20:36:53 798 2

原创 计算机网络知识高频面试题

计算机网络OSI七层协议及TCP/IP四层协议通信交互方式MAC地址和IP地址ARP协议的作用ping发生了什么traceroute发生了什么TCP/UDP的区别和应用场景拥塞控制和流量控制的区别TCP滑动窗口实现流量控制TCP超时重传TCP拥塞机制TCP三次握手及三次缘由TCP四次挥手及四次缘由TIME-WAIT状态及2MSL时间域名系统DNS统一资源定位符URL描述一下HTTP协议HTTP2.0HTTP持久连接与管线化HTTP协议请求报文具体信息GET和PO

2021-05-30 18:59:52 1161 2

原创 QT中的二维绘图

文章目录基本绘制和填充QPainter中常用图形绘制函数使用画笔使用画刷基本绘制和填充在绘图系统中由QPainter来完成具体的绘制操作,QPainter类提供了大量高度优化的函数来完成GUI编程所需要的大部分绘制工作。QPainter一般在一个部件的重绘事件(Paint Event)的处理函数paintEvent()中进行绘制1 widget.h文件protected: void paintEvent(QPaintEvent *event);2 widget.cpp文件void

2021-04-24 18:03:26 976

原创 C++常见笔试编程题

1从尾到头打印单链表//栈的方式void printListReversingly_iteratively(LinkNode* pHead){ std::stack<LinkNode*> nodes; LinkNode* pNode = pHead; while (pHead!=nullptr) { nodes.push(pNode); pNode = pNode->m_pNext; } while (!nodes.empty()) { pNode = n

2021-03-21 20:35:13 1949

原创 算法打卡第一天

第一题:URL化。编写一种方法,将字符串中的空格全部替换为%20。假定该字符串尾部有足够的空间存放新增字符,并且知道字符串的“真实”长度。(注:用Java实现的话,请使用字符数组实现,以便直接在数组上操作。)示例 1:输入:“Mr John Smith “, 13输出:“Mr%20John%20Smith”示例 2:输入:” “, 5输出:”%20%20%20%20%20”提示:字符串长度在 [0, 500000] 范围内。class Solution {

2021-03-09 20:27:44 208

原创 网络编程---------socket编程

文章目录网络字节序IP地址转换函数本地字节序(string IP) ---> 网络字节序网络字节序 ---> 本地字节序(string IP)sockaddr地址结构:socket函数socket函数bind函数listen函数accept函数connect函数TCP通信流程分析:server:client:网络字节序在网络中是以大端法存储的,即高位存低地址,低位存高地址。例如:我们常用的IP地址 192.168.0.1是点分十进制的。在使用时我们要将其转换为网络字节序,用htonl()函

2021-03-07 21:23:46 569

2022年第一篇C语言50行代码制作爱心电子相册的代码

2022年第一篇C语言50行代码制作爱心电子相册的代码

2024-08-06

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除