自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(59)
  • 资源 (1)
  • 收藏
  • 关注

原创 Com 组件基础

Com 组件技术在Windows平台上应用十分广泛,虽然历史久远,但是仍然具有旺盛的生命力。下面提供一个最基础的Com组件供参考学习。

2025-03-14 13:08:54 269

原创 MFC 基础

windows桌面应用分为两种类型: 基于文档视图类型 和 基于对话框类型。通常具有复杂交互控件的程序即为基于对话框类型,相对而言比较复杂,而基于文档视图类的应用交互形式比较单一,相对简单。

2025-02-08 10:03:26 430

原创 c++11的动态类型

c++17引入了any 和 variant,可以将任意数据类型统一用any或variant类型表示,在开发中还是能够带来很多便利的。在c++11版本中,可以用下面这个例子,仿照实现一个Any类型。

2024-11-22 23:28:06 258

原创 队列调度(双队列)

考虑每个队列元素在任意时刻的状态,可以分为4种:空闲(未被生产的空数据),就绪(生产完成待消费),正在被消费,正在被生产,可以设计两个队列FreeQue,ReadyQue,即空闲队列和就绪队列,每次生产时去空闲队列拿一个空闲节点填充数据后,送入就绪队列,每次消费时从就绪队列取走一个节点进行消费,消费完成后送入空闲队列,这样就有序地将各个环节有机组合起来,实现了较为完备的生产消费模型。

2024-11-10 18:36:56 364

原创 多模块共用python环境管理

cc++中调用python 接口前,必须对python 解释器进行初始化,并进行必要的环境配置,这些初始化和环境配置是全局生效的,如果这些接口放到各个模块内部执行,将不利于管理,所以需要提炼一个公共模块,对python的全局环境进行初始化和配置,增加防护措施,以使各个模块和谐共存。

2024-11-05 09:00:03 259

原创 安全字符串操作函数

strncpy_s:与_snprintf_s一致,支持指定目标缓冲区长度,同时支持指定最大拷贝长度,如果源字符串长度+1超出目标缓冲区长度,则会抛异常,如果只是超出最大拷贝长度,则从指定的拷贝长度处截断并且补'\0'。strncpy: 可指定最大拷贝长度,源字符串超出最大长度时直接截断,不会补0,生成的字符串有非法风险。strcpy: 会补'\0',不可指定目标缓冲区长度,也不可指定最大拷贝长度,存在写越界风险。strcpy_s: 会补'\0',且支持指定目标缓冲区长度,源字符串+1超出该长度时会抛异常。

2024-11-02 16:01:14 263

原创 c++11 读写锁实现

【代码】c++11 读写锁实现。

2024-10-10 22:37:28 489

原创 跨平台互斥体封装

当需要进程同步时,可构造进程锁(提供一个锁名称),如果是线程同步,可构造线程锁(提供一个互斥体)。

2024-09-14 18:37:36 256

原创 最近最少使用数据结构(LRU)

抛开算法刷题的角度,LRU数据结构可根据访问时间远近自动排序,在有些场景下还是很有用的,如统计用户活跃度,API调用热力图分析,缓存块管理等。下面基于c++模板提供一个通用的LRU类,以供参考。

2024-08-23 23:38:36 292

原创 c++的二次分发与访问者模式

在使用时,受访者可以根据不同的访问者类型,执行不同的处理逻辑。新增访问者类型时(如Visitor3),先继承Visitor基类,重写visit函数,并且在Acceptor中增加重载方法处理Visitor3类型的访问者即可。

2024-08-19 10:33:37 266

原创 GoogleTest中的Mock用法

所示,首先创建一个抽象接口类,然后派生一个子类Mock该接口类的的纯虚接口,最后开始基于该子类进行单元测试。除此之外,还可以用googletest提供的预置模板类NiceMock进行特定接口mock,而不必为所有的接口做Mock实现。通常在团队开发过程中,业务逻辑会有上下游依赖,你所负责的部分可能会依赖其他团队成员提供的接口功能,在其他成员还没有提供可用的接口之前,你的开发工作可能会因为缺乏必要接口被阻塞,此时需要对这些上未实现的接口进行模拟(Mock),以便你本地的工作能够正常推进。

2024-07-01 00:22:42 679

原创 Rocksdb Tuning

当一个 manifest 文件超过了配置的最大值的时候,一个包含当前 RocksDB 状态信息的新的 manifest 文件就会创建,CURRENT 文件会记录最新的 manifest 文件信息。还是会存放到操作系统的文件系统上面。有些时候,文件系统的操作并不是原子的,可能因为一些系统的问题导致出现数据不一致的状态,即使文件系统有 journal log,也不是绝对安全的。MANIFEST 包括一系列的 manifest 文件,以及标识最后最新的一个 manifest 文件的 CURRENT 文件。

2024-05-31 08:33:33 510

原创 c++ 跨模块传递std容器引发崩溃的问题

由于dll编译方式不同,导致不同的dll模块加载了不同的运行时库,而不同的运行时库维护了不同的堆。如果跨dll传递stl容器,会引起A堆上创建的内存在B堆释放,引发程序崩溃。① 仅用基本的数据类型(数组,结构体,类)传递数据,并且注意内存创建和释放的空间在同一个dll内。② 统一dll的编译方式,要用md都用md,要用mdd都用mdd,不要一个用md而另一个用mdd。实际工作中,有些库的编译类型是我们不能控制的,这种情况下只能用方法①来解决问题。

2024-05-14 21:18:09 317

原创 c++死锁模拟与检测

【代码】c++死锁模拟与检测。

2024-05-06 16:08:02 485

原创 windows版本的epoll

读zeromq源码,发现一个有意思的事情。它竟然包含了一个windows版本的epoll,之前一直以为它在windows下面用的时select IO复用模型,没想到不是。这个wepoll好像是个第三方开源的组件,能被zeromq认可,说明写的还是不错的。接口基本上和linux的epoll一致,简单尝试了一下,用起来确实顺手多了,以后写跨平台的网络基础框架,可以借用一下。这个组件库的master分支内容比较多,zeromq中用的是它的dist分支,只有两个文件:wepoll.h和wepoll.cpp。

2024-05-02 19:46:58 1095

原创 WinDbg分析崩溃dump

4.在输出信息中有“模块名!如果找不到pdb符号文件,excr 输出信息中可能会没有函数名,即"模块名+offset",这个offset为offset0+offset1,如果想看这个崩溃位置所在的函数,可以用kn 指令查看当前线程的函数调用栈,最上面那一行就是目标函数信息,这样也可以推算出offset0和offset1。在模块的反汇编文件中,基地址是.textbss的Imagebase后面的数字,可以根据第4步算出来的offset0和offset1,叠加上这个基地址,就可以定位到出错的指令位置。

2024-04-30 23:20:55 2125

原创 文件系统事件监听

epoll/IOCP监听文件更新

2024-03-10 12:22:31 735

转载 简单动态链接库加载器封装

简单动态链接库加载器封装

2024-03-05 21:23:25 136

原创 qt 软件发布(Windows)

①左下角开始菜单栏找到QT的命令交互对话框,如下图MSVC 2017 64-bit(第二步编译的类型选择64位或者32位)。注:一般软件还有安装引导程序,简单的软件可以在软件包中放一个安装脚本,复杂的软件,可能需要额外开发安装引导界面程序。③windeployqt -dir="xxx/xx/" # 将软件打包到xxx/xx目录。④将软件依赖的其他第三方dll以及配置文件拷贝到xxx/xx中exe可执行文件的同级目录。⑤完成软件打包,将xxx/xxx文件夹压缩,即可去生产环境测试。

2024-02-22 11:17:49 525

原创 搜狗开源框架Workflow网络模型分析

本篇博客分享了高性能后端服务框架workflow在windows系统下的网络模型实现原理,通过源码阅读,梳理了workflow中一个典型网络服务的开启步骤和异步网络事件的产生、触发以及处理所经历的过程,着手剥离了网络模型中的关键模块,在此基础上实现了一个高并发TCP Server,扩充实现了UDP并发服务器,开展了压力测试。

2024-02-02 21:09:24 2553 5

原创 c++ 拆分函数返回值和参数类型

在c++中,函数参数类型和返回值类型通常是一个比较明确的信息,好像确实无需在这个上面费周折。然而,硬编码数据类型会让代码复用性下降,如果能够通过某种方式自动获取函数参数和返回值类型,对于代码的可复用性,可读性和整洁性都有较大的提升。上面的代码,gmock在使用的时候是配合宏实现不同类型函数的统一。

2023-10-30 11:24:07 265

原创 无锁队列Disruptor使用笔记

由于Disruptor原版是java开发的,而本人是从事C/C++开发工作的,期望找一个C/C++版本的实现,用到自己的工作中。Disruptor不对生产者和消费者的数量做限制,可以是单生产者->单消费者,单生产者->多消费者,多生产者->单消费者,以及多生产者->多消费者(这里的每个生产者和消费者都指的是一个线程,而不是某个抽象业务的类实例)。在竞争消费模式下,每条消息的真正被消费的时机是不确定的,有可能先入队的消息后被消费,因此可以看到打印顺序是乱的,这也是这种消费模式的重要特性。

2023-10-19 13:08:46 780

原创 masm 64位CPU汇编指令基础

【代码】masm 64位CPU汇编指令基础。

2023-09-09 14:25:50 564

原创 c语言面向对象开发

从第一节和第二节,我们清晰地看到C++和C是如何对应起来的,这个对应过程从侧面也证明了C++是C的超集,C++完全兼容C,C++代码总是可以写成C的形式。但是面对稍微复杂的项目,这个改写过程将变得极其痛苦,而C++编译器一定程度上就是为了将这个过程自动化而出现的,当然我们最终要的不是C的源码,而是能够运行的二进制机器码,所以C++编译器一步到位地生成了机器码,将中间过程封闭起来。继承和多态是c++的灵魂,如何使用c语言模拟这一机制,是使用c语言实现面向对象开发的关键。三. 从C++到C的自动化转换。

2023-08-21 09:39:01 159

原创 关于3D位姿旋转

3d 物体姿态变换,欧拉角,旋转矩阵,四元数相互转换

2023-08-17 09:41:53 1228

原创 Lua脚本编程基础

三. lua与c/c++的互操作。2. function类型。3. userdata类型。2. boolean类型。3. numbers类型。4. string类型。4. thread类型。1. table类型。

2023-07-02 16:49:21 951

原创 C++类静态成员初始化顺序

存在多个全局变量时,它们的初始化顺序是未知的,如果某些全局变量初始化依赖了其他的全局变量,可能会诱发程序未定义行为,在进入main函数之前就崩溃。尤其是在c++类的静态成员之间,这种依赖关系还是挺常见的,一旦发生这种bug,是很难定位的,一来没办法debug,因为还没进入main就崩了,在一个这种问题可能还是偶发的,更难排查了。此时,派生类的静态成员就依赖了父类的静态成员,有可能派生类静态成员去执行初始化时,父类的静态成员尚未初始化,这样就直接导致程序异常退出。

2023-06-05 16:08:16 580

原创 关于socket的地址复用和端口复用技术与UDP并发

可以看作是内核级负载均衡。观察上述代码,可以注意到,当获知了客户端的源端口和源ip后,会将新udp socket连接到该客户端(执行了connect操作),这样一来,新的udp socket五元组就唯一确定了,下一次该客户端再发数据包,就会直接找到这个新的udp socket,放到指定缓冲区,而不会随机分配了。socket是系统级资源(区别于进程级和线程级,在本机上是全局唯一的),可以人为绑定本地ip和端口,与协议类型,对端ip,对端端口一起,作为该socket在本机上的唯一标识。

2023-05-24 18:41:46 3264

原创 c/c++ 结构体字节对齐规则

/ [b1][b2] offset=1, short数据默认的对齐参数为2,因此offset需要调整为2的整数倍,即offset调为2, 在前面数成员aa末尾填充一个字节。// [f1][f2][f3][f4] offset=17, float数据默认的对齐参数为4,offset调到20,所以在前面的数据成员e末尾填充3字节。// [d1][d2][d3][d4][d5][d6][d7][d8] offset=8, double数据对齐参数为8,不需要调整。struct D d;

2023-04-16 16:42:45 523

原创 TELNET 协议初探

TELNET通讯协议初探

2023-04-06 10:52:39 811

原创 编译器指令#pragma section的使用

pragma section() 指令的使用

2023-04-03 14:34:43 6328

原创 swig 使用案例

包含数组、结构体嵌套,函数指针传递等基本操作.

2023-03-10 20:55:19 913

原创 c++简单定时器实现

c++简单定时器实现。

2023-03-02 15:46:53 4345 2

原创 Ros中的轨迹规划模块

ROS中的运动规划

2023-01-30 16:49:43 4133 3

原创 ROS 笔记(一) 数据结构

ROS通讯中的自定义数据结构

2022-12-09 16:33:00 725

原创 网络通讯大小端转换c/c++

c/c++ 大小端字节序转换

2022-12-02 23:29:45 910

原创 windows 下包管理工具vcpkg安装

vcpkg包管理工具安装

2022-10-26 20:04:41 6951 1

原创 c/c++自定义通讯协议(TCP/UDP)

socket网络编程中的网络协议设计

2022-07-11 00:11:16 11101

原创 关于多线程编程想到的

1. 多线程编程实际上是一种"异步"编程。在单线程程序中,同一时刻线程只能干一件事,所有的任务都有序地执行,业务逻辑是连续的;2. 利用多核CPU,在物理层面上并行计算,引入多线程编程技术才有实际意义。3. 多线程程序,业务逻辑上是割裂的,因为想要将整个业务切割成多个部分放到不同的CPU上处理。这种割裂具体体现就是任务的回调函数,回调函数执行的部分就是被切分出来的剩余业务逻辑。4. 线程之间的数据传送应该是单向的,使用任务队列进行解耦。每个线程应该只关心自己的那部分,如果业务逻辑还需要切..

2022-03-02 10:13:48 266

原创 Innodb和Myisam索引

id name age country stand name 1 Dio Brando 121 埃及 世界 2 jonas 21 英国 null 3 Joseph 79 美国 隐者之紫 4 Kujo Jotaro 41 日本 白金之星 Innodb 索引[索引页]非主键索引和主键索引,都是"稀疏键值+子索引页地址"或者"稀疏键值+数据页地址"。[数据页]

2022-02-26 22:04:51 231

com组件示例,包含继承,包容以及聚合三种Com组件组织方法

com组件示例,包含继承,包容以及聚合三种Com组件组织方法

2025-03-25

windows文件操作+环境变量+注册表操作工具代码

包含windows下的文件读写,权限获取,环境变量设置,查询,注册表操作等基本系统函数的封装

2024-08-13

stip-wintools.rar

在windows上运行时空兴趣点检测工具时,一般会报缺少dll库。因为stip可执行程序在编译的时候用到了第三方库opencv,所以需要使用opencv里面的dll文件。stip-1.1程序创建于2008年,作者当时采用的是opencv1.0,所以我们必须提供opencv1.0的库文件(所以后缀为100,如cv100.dll),把本资源提供的dll文件拷贝到stip-1.1文件夹下面,就能跑通程序了,无需再去安装opencv1.0。(读取视频的时候也用到了较老的库,所以可能系统自带的库无法使用,造成could not initialize capturing.. 我们应当再装一个Xvid视频解码软件,用最新的就行,本资源提供了Xvid-1.3.2-20110601.exe,双击一路默认安装)

2019-11-19

空空如也

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

TA关注的人

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