- 博客(37)
- 资源 (8)
- 收藏
- 关注
原创 使用子进程实现 C++ 与 Python 交互式控制台
本文介绍了一种在C++中嵌入Python解释器的技术方案,通过Windows匿名管道实现进程间通信。适用于需要混合编程的场景。
2025-10-22 11:51:24
469
原创 Qt浮动(堆叠)窗口实现详解
本文介绍了Qt界面开发中实现浮动窗口的两种方法:直接子控件定位法和AnchorLayout锚点布局法。直接定位法通过move()方法手动定位控件,适合简单的悬浮元素;而AnchorLayout采用类似QML的锚线连接方式,能自动适应容器变化,适用于复杂布局。
2025-10-16 18:48:34
352
翻译 Qt Widgets的锚点布局
本文介绍了为Qt Widgets实现的AnchorLayout布局系统,灵感来自QML的锚点布局功能。相比传统QVBoxLayout/QHBoxLayout等布局方式,锚点布局通过定义UI元素之间的相对位置关系(如左对齐、居中等)来更直观地控制界面布局。该方案通过引入类似QML的锚线概念,让Widgets开发者也能享受QML式的灵活布局方式。
2025-10-16 18:11:05
60
翻译 使用 C++ 实现通信协议的指南(六)
本文介绍了comms通信库的成果与实现细节。该库通过声明式编程简化了通信协议开发,无需编写冗余代码,支持灵活扩展和跨平台应用。附录提供了三个核心模板函数的实现:tupleForEach遍历元组元素,tupleAccumulate实现元组元素累加,tupleForEachFromUntil支持对元组指定区间的操作。这些函数通过模板元编程和编译时递归技术,在保持类型安全的同时实现了高效的元素处理,展现了C++模板元编程在通信协议开发中的强大能力。
2025-08-29 17:32:38
36
翻译 使用 C++ 实现通信协议的指南(五·下)
本文介绍了如何用C++定义并实现一个自定义通信协议栈。协议结构包含SYNC、SIZE、ID、PAYLOAD和CHECKSUM字段,采用大端字节序。文章详细说明了各协议层的实现方式,包括Payload层、ID层、Size层、Checksum层和Sync层,并展示了消息处理循环和写入逻辑的代码示例。该协议栈支持消息的序列化、反序列化、校验和验证等功能,适用于网络通信场景。通过模板和选项配置,实现了灵活的消息处理机制。
2025-08-29 17:29:11
43
翻译 使用 C++ 实现通信协议的指南(五·中)
本文介绍了通信协议中尺寸层和同步层的实现设计。尺寸层负责处理消息长度信息,在读取时验证数据完整性,在写入前计算并写入消息长度。同步层则负责验证同步前缀的正确性。两个层都采用模板化设计,通过嵌套调用下一层完成操作。文章还展示了各层必须实现的length()成员函数,用于计算消息序列化所需字节数。这种分层架构支持灵活的协议组合,允许不同协议以不同顺序处理ID、SIZE等信息。
2025-08-29 16:55:11
64
翻译 使用 C++ 实现通信协议的指南(五·上)
文章摘要: 本文介绍了通信协议中传输层的设计与实现,重点讨论了如何通过分层处理(如SYNC、SIZE、ID、PAYLOAD、CHECKSUM等)确保消息在I/O链路上的可靠传递。针对不同链路类型(如TCP/IP和RS-232),协议需采用不同的封装格式。文章提出使用独立的“块”(层)结构处理传输信息,通过字段类复用和协议栈分层(如有效负载层、ID层)实现数据解析与封装。其中,ID层负责创建消息对象并处理消息ID,而有效负载层则直接与消息对象交互。
2025-08-29 14:53:46
67
翻译 使用 C++ 实现通信协议的指南(四·下)
本文介绍了通信协议中通用字段的实现方法,重点讨论了如何通过模板化基类处理字节序问题。文章提出了一个基础字段类comms::Field,通过模板参数区分大小端序,并利用标签分发技术实现不同字节序的读写操作。具体字段类(如整数字段)通过继承该基类获得序列化能力,同时允许灵活配置字节序信息。文章还探讨了两种应用场景:固定字节序协议的明确定义和动态字节序协议的消息接口传递方案,为通信协议开发提供了可扩展的字段实现框架。
2025-08-29 14:36:16
54
翻译 使用 C++ 实现通信协议的指南(四·中)
本文介绍了通用消息实现类comms::MessageBase的设计与实现。该类作为MessageBase的通用版本,可跨协议复用,提供ID获取、消息调度、接口扩展和字段操作等核心功能。通过模板参数配置,支持静态ID定义(StaticNumIdImpl)、消息分发(DispatchImpl)和字段管理(FieldsImpl)等选项。采用选项解析和模块化继承机制,将功能实现分解为独立基类(如处理ID的MessageImplStaticNumIdBase和处理分发的MessageImplDispatc
2025-08-29 14:34:25
48
翻译 使用 C++ 实现通信协议的指南(四·上)
本文介绍了如何设计一个通用的二进制通信协议开发库,重点阐述了通用消息接口的实现方法。通过C++11可变参数模板技术,作者提出了一种灵活配置消息接口的方案,允许开发者按需选择功能(如消息ID类型、读写迭代器、字节序、有效性检查等)。文章详细展示了如何定义选项类(如MsgIdType、ReadIterator等),并通过模板元编程解析这些选项来生成定制化的消息接口类。该设计实现了接口功能的模块化配置,可根据项目需求灵活组合,为二进制通信协议开发提供了高度可复用的基础框架。
2025-08-29 14:30:34
75
翻译 使用 C++ 实现通信协议的指南(三)
本文介绍了一种利用C++元编程技术实现通信协议消息字段自动化处理的方法。通过定义字段元组(AllFields)和使用tupleForEach算法,实现了消息序列化(readImpl)和反序列化(writeImpl)的通用处理。关键技术包括:1) 使用模板函数对象FieldReader/FieldWriter处理不同类型字段;2) 通过MessageBase基类消除重复代码;3) 利用std::tuple管理字段集合。
2025-08-29 14:22:36
39
翻译 使用 C++ 实现通信协议的指南(二)
原文链接:https://commschamp.github.io/comms_protocols_cpp/#_message。
2025-08-29 14:16:46
100
翻译 使用 C++ 实现通信协议的指南(一)
本文介绍了一种灵活、通用的C++(11)库设计方法,用于实现嵌入式系统中的二进制通信协议。作者指出传统代码生成工具存在诸多限制(如无法定制二进制布局、依赖动态内存分配等),不适用于嵌入式系统开发。文章提出了基于C++模板元编程的解决方案,支持跨平台重用、协议灵活扩展和高效消息分发,同时避免动态内存分配和运行时类型识别。该设计方案已实现为COMMS库,适用于从裸机到Linux系统的多种平台,通过类型声明而非代码生成来简化协议实现。
2025-08-29 14:04:53
96
原创 C++异步编程:优雅处理多线程异步返回结果
基于std::promise和std::future的异步结果管理方案,旨在解决现代C++异步编程中的常见挑战。
2025-05-20 17:26:15
536
原创 通过vcpkg交叉编译grpc:构建Arm64平台的Docker化开发环境
利用Docker和vcpkg构建ARM64平台的gRPC交叉编译环境,实现在x86主机上为ARM架构开发高性能RPC服务。
2025-05-19 18:17:03
1190
原创 基于任务组的线程池(SequentialThreadPool)
基于C++11实现的一个head-only的线程池。对任务进行分组,同一个组内的任务按照入队顺序进行执行,不同组之间的任务抢占式执行。
2024-08-02 18:14:11
494
原创 【调试记录】QT中使用多线程导致的死锁
子线程在第17行获取到锁,主线程刚好运行到24行准备获取锁。此时子线程执行第18行,阻塞调用等待主线程执行。子线程已经获取到锁,主线程等待获取锁,子线程又等待主线程事件循环执行函数,由此产生死锁。方案二:在锁外调用(仅适用于无数据竞争的情况,或采用原子变量),即去掉第17行的加锁。原因在于第18行采用阻塞队列的连接方式。方案一:将18行阻塞调用改为非阻塞调用。
2023-04-15 22:54:57
972
原创 由QCustomplot引发drawPolyline和drawLine的区别
标题一、起因二、原因分析2.1 测试2.1 查看QCustomplot中绘制源码三、解决方法四、drawPolyline和drawLine的区别五、对QCharts进行测试一、起因最近在使用QCustomplot绘制曲线图时,遇到性能低下(卡顿甚至无响应)。测试的功能为用rand()函数动态生成1000个数据点,其数据值范围为0<=X<1000, 0<=Y<100, X步进=0.1,其代码如下:#include <QApplication>#include <
2022-01-16 16:55:32
2636
原创 OpenSSL中的Diffie-Hellman密钥交换
Diffie-Hellman(DH)密钥交换协议的原理及其在OpenSSL中的C++实现。DH协议基于离散对数问题,允许双方在不安全的信道上安全地生成共享密钥。
2021-11-29 22:17:29
1016
1
原创 FFmpeg将图像数据编码为H264视频
图片数据编码为视频的步骤如下:1、 BGR数据转换为YUV格式;2.、YUV格式进行编码;其中对YUV格式进行编码又分为以下步骤:通过avcodec_find_encoder函数找到需要的编码器;通过avcodec_alloc_context3初始化编码器上下文,并设置编码器上下文的参数(包括码率、时间基、视频宽高等);通过avcodec_open2函数打开编码器;通过avformat_alloc_output_context2函数初始化输出文件上下文;通过avformat_new_str
2021-09-25 22:50:00
5146
5
原创 C++11模板元编程—std::enable_if使用说明
std::enable_if是C++模板元编程中的重要工具,用于条件编译和类型选择。其核心机制是当第一个模板参数为true时定义type类型别名。
2021-08-29 13:52:02
7710
原创 C++模板元编程实现序列化与反序列化
本文介绍了一个基于C++模板元编程实现的序列化/反序列化工具。该工具支持基本数据类型(char/int/float等)、字符串(std::string)和向量(std::vector),包括嵌套结构。
2021-06-20 15:42:50
895
原创 C++虚函数实现模拟
目录前言虚函数表分析虚函数模拟实现虚函数原理分析前言虚函数的实现包含两个重要部分,虚函数表和虚函数表指针。虚函数表:一个类如果有虚函数,则针对这个类会产生一个虚函数表;虚函数表属于类。虚函数表指针:生成这个类的对象时,对象里就包含了一个指针(虚函数指针),用来指向这个虚函数表的起始地址;虚函数表指针属于对象,一般位于对象内存的起始位置。虚函数表分析看如下示例代码(代码1),父类Base包含三个虚函数f、g、h,子类Derive重写了其中两个虚函数f、g:class Base{pub
2020-11-15 23:00:29
337
原创 C++大量线程等待与唤醒
一、线程唤醒方法C++11之后提供了thread线程类,可以很方便的编写多线程程序。线程的等待和唤醒使用条件变量condition_variable和锁mutex结合实现,其中条件变量提供了wait(), notify(), notifyAll()等方法。wait()的作用是让当前线程进入等待状态,同时,wait()也会让当前线程释放它所持有的锁。而notify()和notifyAll()的作用,则是唤醒当前条件变量上的等待线程;notify()是随机唤醒单个等待的线程,而notifyAll()是唤醒
2020-06-20 18:01:36
11756
2
原创 QtCharts图形移动和缩放
本文介绍了QtCharts曲线图的交互功能实现方案,包括移动、缩放和复位等操作。通过继承QChartView并重写鼠标和键盘事件,利用QChart的scroll()函数实现移动,通过setRange()调整坐标轴范围实现缩放。
2020-04-27 22:30:42
13808
5
原创 C++虚函数实现原理
C++虚函数实现原理前言实现机制实例分析测试代码及输入结果结果分析前言C++中的虚函数的作用主要是实现了多态的机制。基类定义虚函数,子类可以重写该函数。实现机制每个类对象添加一个成员,该成员中保存了一个指向函数地址数组的指针,称为虚表指针(vptr),该数组称为虚函数表(virtual function table, vtbl),即,每个类使用一个虚函数表,每个类对象用一个虚表指针。实例...
2020-04-26 23:12:15
301
原创 QtXlsx 编译安装
本文介绍了QtXlsx库的完整安装配置过程:首先下载QtXlsxWriter源码,安装对应版本的Perl5;然后通过QtCreator编译源码,生成相关库文件;接着将头文件、库文件、模块文件分别复制到Qt安装目录的对应位置;最后运行示例程序测试配置是否成功,若能生成Excel文件则说明安装正确。整个过程包含详细的路径指引和文件操作说明,确保用户能顺利完成QtXlsx库的环境搭建。
2019-12-23 11:22:52
3377
1
原创 单链表反转原理及实现
1 节点定义单链表节点的数据结构定义如下:/* 定义结节点 */typedef struct _Node{ int value; Node* next;}Node;2 方法:迭代法2.1 思路遍历整个链表,并把当前节点的next指向上一节点。2.2 分析1.初始链表状态如下图所示。2.定义节点指针①定义前向节点指针,并初始化为head。Node*...
2019-12-19 17:37:23
682
原创 CUDA并行计算求复数序列最大模长
在CUDA并行计算中,求复数模长的最大值采用了规约算法。核函数array_max通过将全局数据复制到共享内存,并在块内进行逐步比较,最终找到最大值。
2018-11-26 19:38:58
6243
原创 Ubuntu 嵌入式交叉编译环境搭建
仅以一个arm-linux-gcc讲解交叉编译工具安装配置,许多用户安装后编译或者查看gcc时出现: not found,出现这种情况是环境配置有问题。当然网上也有许多配置说明,但许多都只能在root用户下使用,切换为普通用户后会又出现: not found,其实还是环境配置不完整,只配置了root用户下的环境变量,而没有配置当前普通用户的环境变量。下面我将介绍一下我的配置方法:一、解压...
2018-06-28 16:34:39
2249
原创 解决C++调用Python中文乱码
C++调用Python,包括参数传递及返回值的处理的教程都很多。但是对于中文字符作为参数传递时,会遇到编码问题而乱码甚至崩溃。经过搜集资料,终于解决乱码问题,特记录在此:1、参数传递一般采用PyObject* objArg = Py_BuildValue("s", "Hello")构建参数,当输入参数为中文时,objArg则返回为空指针。原因是:Python为UTF-8编码,而C++中中文大多采用...
2018-04-09 22:40:37
4387
3
原创 Qt应用程序文字显示不全
用Qt写了一个模拟购票系统,在自己电脑(Windows10,分辨率:1366*768)上运行界面正常。当在别人电脑(windows7、windows10,分辨率都为:1920*1080)上运行时就出现了一些文字被遮挡覆盖的现象。查阅了大量资料,发现没有具体讲述是什么原因的(可能查阅资料能力有限),于是自己分析了几天,终于有了结果,在这里给大家分享一下。一、测试过程:我又找了...
2017-10-27 19:16:04
13979
5
原创 U盘无法识别读取
U盘插进电脑里有提示音,但是打开我的电脑却没有U盘,点击桌面右下角的小三角,里面也有U盘图标,该怎么让它显示读取出来呢?第1步:在此电脑上点击鼠标右键,选择管理第2步:点击左侧存储下面的磁盘管理,在右侧显示了当前系统的所有磁盘,其中可移动磁盘列有一个磁盘(就是未显示出来的磁盘,因为没有驱动器号) 第3步:选择该移动磁盘,点击鼠标右键选择更改驱动器号和路径....
2017-10-24 18:17:31
2932
1
QtCharts图形移动和缩放
2022-11-28
C++二进制文件读写
2018-04-09
DBSCAN-1D密度聚类
2019-09-17
QtCharts图形移动和缩放
2020-04-27
二进制文件转CSV文件
2020-04-27
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅