自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(135)
  • 收藏
  • 关注

原创 C11 日期时间处理案例

所有例子在VS2019上编译运行通过。

2025-05-21 14:26:19 225

原创 C/C++ 整数类型的长度

数据模型确定整数类型的大小,不同的平台使用的数据模型不同。而且C/C++ 的整数类型定义的形式也很多,现在给出。在某些语言中,整数类型的长度是固定的,如java中。可是C/C++ 与机器相关,整数类型长度与平台有关。在C标准中同平台一定保证。列举4种常用的数据模型。

2025-05-20 17:07:56 493

原创 C++ 编译期检查返回值是否被使用

为了处理错误,可以把函数的返回值定为bool 或 int 或 自定义的result,调用程序时约定检查返回值来判断程序是否出现异常;C++ 中的 [[nodiscard]] 是 C++17 引入的一个属性(Attribute),用于提示开发者或编译器:​。如此声明函数,编译期发现在critical_operation函数调用的返回值被忽略时会发出警告。当使用这个选项时,对所有函数的返回值被忽略时都会发出警告。这里就需要一种编译期的检查提示必须使用函数的返回值.上面例子在编译时会出现警告。

2025-05-12 14:30:23 304

原创 Clang-Tidy协助C++编译期检查

C/C++语言是一门编译型语言,比起python,javascript 这些,有很多BUG可以在编译期被排除掉,当然编译器自身的检查比较有限,需要借助第三方工具,如clang-tidy。

2025-04-30 14:28:37 376

原创 Qt动画 QAbstractAnimation

QAbstractAnimation 是所有 Qt 动画的基类。该类定义了所有动画应该都会有的功能函数。要想实现一个Qt自定义动画,需要继承此类。一个动画的进度由函数给出。一个动画的进度以毫秒为单位。动画从0开始,到duration()结束,在动画运行时自动更新进度值。也可以通过函数直接定位进度。一个动画有三个状态,Running,Stopped,Paused.可以通过start()stop()pause()resume(),来改变状态.在start()时,动画会重置进度.

2025-04-09 16:06:21 936

原创 WinDbg. From A to Z! 笔记(下)

原文链接: WinDbg. From A to Z!** 是Application Verifier 的内容这里有一个简单的死锁例子暂时跳过自动伪寄存器(内置的伪寄存器)自定义伪寄存器宏汇编(MASM) 表达式C++ 表达式例子:提供了简单的事件过滤目标应用的事件发生后的响应使用命令来列举所有事件中断或执行状态:处理或继续状态:安装了Windows SDK的话会在这里找到Global FlagsGFlags Application VerifierApplication Verifier如果

2025-04-03 17:22:29 1085

原创 Windows C++ 排查死锁

现在可以打开WinDbg,Attach 到目录进程,在这之前要设置好符号目录,这些步骤就跳过。开发出来应用程序突然间卡死不动,如果其中是因为死锁问题卡列该如何排查。线程18208 在等待11188结束,线程11188 卡住了。以Debug模式编译运行后,毫无意外的没反应了。CPU利用率0,显然不太会有死循环,右键"现在打开任务管理器,找到进程。计算下11188 是哪一条。下面是一个简单的死锁例子。

2025-04-01 17:27:26 304

原创 Window C++ Postmortem Debugger

开发出一款应用在上线运行可能会出现突然暴毙崩溃的情况,这时候该如何排查出原因呢,如果可以"开棺验尸"的话,就应该可以轻松找出原因并改正。

2025-04-01 15:05:29 173

原创 WinDbg. From A to Z! 笔记(上)

原文链接: WinDbg. From A to Z!Fact 1: WinDbg is really just a shell on top of a debugging engine.Fact 2: You can write new standalone tools on top of this engine.Compiler options: Linker options: 侵入式附加非侵入式调试注册表项 常规命令元命令(点命令)扩展命令必须设置 _NT_SYMBOL_PATH 环境变

2025-03-27 16:59:22 639

原创 如何排查C++程序的CPU占用过高的问题

可以清楚看到程序是卡在busy_task函数,fst0.cc 文件的第8行那里。可以看到有两个线程,2473主线程号与进程号相同,2474是耗时的那个子线程号。可以明显看到卡在了busy_task 函数,点击后面的蓝色链接可以看到源码。现在Fst0.exe 已经在运行当中了,使用WinDbg来附加到进程,现在知道fst0的进程号是2473,还需要知道fst0的耗时线程是哪个。可以清晰的看到程序是卡在busy_task那个函数上了!看看各个线程的执行时间,可以看到4号线程执行时间最长。

2025-03-26 10:22:41 1153

原创 windows 上的cscript javascript

在操作系统为了批量处理或者自动化运行等等运维开发事务,会选择一种脚本语言作为辅助。在linux 上可以选择shell, 很多系统会预装python ,使用python 也是一种不错的选择。在windows系统上可以选择 cmd,powershell, vbs,javascript。因为脚本语言的流行程序与学习成本,javascript 是一种很好的选择。在windows 可以使用系统自带的cscript.exe来执行javascript 脚本。

2025-03-21 16:35:59 1069

原创 windows编译FreeSwitch

直接生成有main函数的FreeSwitchConsole子工程。yasm.exe 文件放到libvpx子工程目录下。使用vs2015 打开项目目录下的。解压到项目libs目录下。从依赖库地址下载依赖库。

2025-03-20 13:03:07 242

原创 windows 平台编译openssl

正确安装了VisualStudio2019的话可以在win菜单中打到,可以在win任务栏的搜索中搜到。下载解压后要加入系统环境变量中。进入openssl 源码目录。解压后设置系统环境变量。使用64位编译,输出。

2025-03-20 10:07:28 460

原创 NAT及P2P通信

NAT(网络地址转换,Network Address Translation)是一种网络技术,用于将私有网络中的IP地址转换为公共IP地址,以便与外部网络(如互联网)通信。其主要目的是解决IPv4地址不足的问题,并增强网络安全性。我们可以用一个非常长的网络地址,比如128 位地址,可以表示$2^{128} = 340282366920938463463374607431768211456$个机器。但世界没有如此能力的路由器来直接制表。

2025-03-18 14:28:14 1070 1

原创 windows C++ 申请大量内存

假设现在的机器是64位的windows,其用户的虚地址空间是0x000’000000000到0x7FFF’FFFFFFFF,约128 TB。windows上的malloc可能是使用HeapAlloc或VirtualAlloc实现的,内存不够用的时候发生崩溃。虚拟内存可能在不使用的时候暂存到硬盘交换区中去,可以使用MEM_RESET与MEM_RESET_UNDO来操作。在程序的应用开发时候,面对内存密集型操作时,需要大量内存,可能需要远超物理内存空间的内存,该怎么做呢?可以考虑使用malloc动态申请内存。

2025-03-12 17:44:29 387

原创 多线程下智能指针

这样写自然是没问题,但在界面交互的情况下,dataItem的生命周期可能取决于用户的操作,而线程Worker 依赖于dataItem,当一个实例被多个线程引用,当线程并未结束时,此实例提前销毁会出现什么情况?Worker的销毁时机也应该取决于dataItem。运行后得到一个经典错误,如果把main函数改写成如下。利用智能指针改写如下。

2025-02-26 14:25:07 240

原创 并发 -- 内存模型

内存模式定义了多线程环境下,内存操作的可见性和顺序。它规定了线程如何看到其他线程对内存的修改,以及这些修改的顺序常见内存模式:顺序一致性(Sequential Consistency):所有线程看到的内存操作顺序一致,且与程序顺序一致。简单但性能较低,因为需要严格同步。松弛一致性(Relaxed Consistency):允许线程看到不一致的内存操作顺序,提升性能但增加编程复杂度。需要显式同步操作(如内存屏障)来确保一致性。内存顺序指多线程环境中,内存操作的执行顺序。

2025-02-24 16:55:31 837

原创 并发 -- 无锁算法与结构

无锁算法(Lock-Free Algorithm)是一种并发编程技术,旨在实现多线程环境下的高效数据共享,而无需使用传统的锁机制(如互斥锁)。无阻塞:至少有一个线程能在有限步骤内完成操作,确保系统整体不会因锁争用而停滞。无死锁:由于不使用锁,避免了死锁问题。高并发性:适用于多核处理器,多个线程可同时操作共享数据,减少等待时间。在C++ 可以使用原子变量来实现无锁算法与结构。

2025-02-24 14:35:01 886

原创 C++ 如何销毁进程

需要自行包装一下Thread,在线程运行结束后自我销毁,或者由第三个对象在判断线程运行结束后再销毁线程对象。main函数一个主线程,Shell_Thread,thread_func 分别一个线程,总共3个线程。但MyThread::run中执行太多耗时操作,而MyWrap是界面的操作,将会导致界面长时间卡顿。tptr 所指向的thread对象销毁了,但thread_func 这个函数仍然在系统中运行。换成一个全局的变量,程序可以按照预期的方向运行。可以解决问题,但明显不会是一个好的方式。

2025-02-18 19:43:05 465

原创 Window C/C++ 内存申请

C++内存申请分为数据区内存,栈内存,堆内存。其中全局变量与静态变量存储在数据区,可能会初始化为0。全局变量,静态变量,局部变量的生命周期由系统管理。局部变量存储在栈空间,,在Release模式下是随机值如下面例子在Debug模式下输出在Release模式下输出windows平台下,C++的堆内存申请有以下几种其中 malloc 是 C/C++标准库中的内存申请函数,new是C++动态申请内存的关键字,其他的是Windows的API。

2025-02-18 15:07:40 618

原创 Qt绘图基础项目 --- 生成随机验证码

一般显示图像的过程,是要发生在显示对象的 paintEvent中的,现在并不打算重写某个类的paintEvent函数,而是VerifyCode对象加入到显示对象的eventFilter,重写eventFilter在eventFilter里面取到窗口重绘事件。而在 m_imageCodeBuff 缓冲区上绘制验证码的时机和过程,可以在做一个QTimer,在验证码超时时重新生成,也可以在初始化的时候就生成一次。Qt 绘图有三个基础类 QPainter, QPaintDevice, QPaintEngine。

2025-02-13 15:33:24 233

原创 C++多态类型间的转换

利用C++的虚函数+继承可以实现多态例如下面一个例子。注意 类一定要有虚函数表,就是一定要有虚函数。这样可以利用dynamic_cast。在事件处理函数中可能有这样一种情况。这其中子类到父类存在隐式转换。我们希望得到ev正确的实例。现在多加上一个事件类。附加一个多继承的例子。

2025-02-13 14:31:27 180

原创 C++整型移植

C++中以整数存储的基本类型有 bool,char,short,int,long,long long,但在不同的CPU平台,这些整数的长度是不同的,如果是使用GCC编译器的话移植的可以更准确点。但对于其他类型转成整形时,还是要检查其长度的。可以利用C++模块让这个事情更方便一点。像一些系统的移植,会给出头文件配置。

2025-02-12 10:05:37 151

原创 Qt绘图系统核心 QPaintDevice

‌QPaintDevice是Qt绘图系统中的一个核心类,它是一个二维空间的抽象,允许QPainter在其上进行绘制操作‌。QPaintDevice定义了一个可以进行绘图的逻辑空间,这个空间可以是屏幕、打印机等不同的输出设备。QPaintDevice的具体实现包括QWidget、QImage、QPixmap、QPicture和QPrinter等‌。

2025-02-11 18:17:35 425

原创 客户端布局 --- 左侧导航栏右侧内容页

在稍稍复杂一点客户端,需要承载许多内容,通常会采用左侧导航栏右侧内容页的框架布局。用Qt实现可以简单的采用 QTreeWidget + QTabWidget来实现。可以把左侧菜单导航配置到文件。

2025-02-11 17:17:03 233

原创 在windows上QString宽字符问题

在windows上使用Qt做图形界面开发的时候,会遇到中文字符乱码的问题,但源代码的字符编码与界面上的编码同样是GBK,还会出现这个问题,下面是一个例子。在断点中看到cstr与p的地址分别为 0x0023cf54与 0x00de28f0。像unicode 宽字符就不能直接用原生字符串初始化QString。这个str 输出到windows图形界面上就会是一个乱码。更好是使用QString 提供的工具。我们可以看看内存中数据是如何存储的。在调试模式下打开内存窗口。在内存窗口查看这两个地址。

2025-02-11 15:43:08 212

原创 C++编译期优化 ---分支预计__builtin_expect

在编写程序逻辑的时候,使用了大量的if-else 分支,为了程序尽可能的高效运行,会考虑把可能性更高的条件写在前面,这样程序的平均运行时间会更短。,这是告诉编译器expr为真的可能性更大,编译后这个分支会在前面。,这是告诉编译器expr为真的可能性很小,编译后这个分支会在后面。这是c/c++中表达式转成bool类型的一种技巧,这一分支在编译成汇编时会放在后面,会优先判断。gcc提供了一种方式,可以让编译器自行优化。

2025-02-11 12:29:52 189 1

原创 FFmpeg(一) 简介

FFmpeg 还提供了播放器相关功能avformat,avcodec 可以播放各种媒体文件或者流,ffplay 是主要播放器。ffprobe 是FFmpeg 中的多媒体分析器,可以得到媒体的信息,比如媒体格式,总时长,复合码率,包长度,包类型,帧信息。ffmpeg.exe 是FFmpeg 源代码编译后生成的一个可执行程序,是FFmpeg的编解码工具,作为命令行工具使用。FFmpeg的编码器支持可以通过。FFmpeg的解码器支持可以通过。FFmpeg的解封装支持可以通过。FFmpeg的封装支持可以通过。

2025-02-09 15:33:45 754

原创 Windows上工程组织方式 --- dll插件式

通过LoadLibraryA 将动态库加载进来,约定每个库都有一个注册函数,取消注册函数,注册函数进行一些初始化操作,可以把全局对象传入到模块中,各个模块之间可以能通过一个全局对象进行通信。对于软件的线上更新动态库会更加方便,特别是客户端软件,模块的更新只要下载新的动态库即可。一个工程需要分模块开发,各个模块以动态链接库或者共享库的形式存在是一种比较好的选择。使用动态库开发,软件编译后的体积比静态库较小,运行时占用内存也会相对较少。在MainObj中编写各个模块的业务功能代码。下面是一个简单的示例。

2025-02-07 23:32:35 240 1

原创 window上动态库126错误

第二种是dll缺少依赖,可以使用Dependencies软件查看dll的依赖是否完整。第一种可能是不同的编译器版本不同导致的,调用dll尽量使用同一版本编译器。

2025-02-07 16:05:27 125

原创 C++ 获取当前执行文件路径

在linux 平台上需要用到 /proc/{pid}/exe 文件。在windows平台上可以使用 _get_pgmptr 其原型是。可以直接使用 main函数的参数。

2025-02-07 14:30:20 226

原创 windows C++ Fiber (协程)

协程,也叫微线程,多个协程在逻辑上是并发的,实际并发由用户控件。windows 上Fiber的调度需要用户自己控制。在windows上引入了纤程(fiber)。WinBase.h 中函数原型。

2025-02-06 19:23:40 375

原创 C++编译期优化 --- 编译期假定

这个程序会输出b,而且if(x==1) 后面的内容不会被编译。C++有编译期断言,主要是用来给编译器提供额外的信息,帮助编译器做优化。很多编程语言有运行期断言,当条件为真时正常运行,当条件为假时抛出异常。在C++23 标准里可以使用特性。这样程序运行没有输出,因为。这段代码没有被编译。在gcc 上可以使用。

2025-02-06 14:37:31 241

原创 C++暂时关闭编译器警告

通过编译器警告,可以关注到哪些是危险代码,是可能引发BUG的,但对于一些基础的已经验证过的代码段,不希望编译器发出警告,可以对某一段代码屏蔽警告。

2025-02-06 13:59:19 173

原创 查看C++宏展开

在许多工程中,C++工程师喜欢使用宏来简化语句,自动生成代码,但复杂的宏可能会很难调试,可以让编译器把预处理结果输出到文件。在visual studio 上可以。这样输出的*.i 文件可以看到宏展开。

2025-02-06 12:31:00 245

原创 Window获取界面空闲时间

‌GetLastInputInfo‌是一种Windows API函数,用于获取上次输入操作的时间。该函数通过LASTINPUTINFO结构返回最后一次输入事件的时间。那么可以利用GetLastInputInfo来得到界面没有操作的时长。

2025-02-05 19:03:51 246

原创 C++间接寻址级别不同

在visual studio上编译时出现了这个报错,这种莫名其妙的问题看起来好像要向底层找BUG,其实很简单,是变量命名冲突。

2025-02-05 17:17:34 238

原创 stm32f103 单片机(一)第一个工程

系统上已经安装好了keil5 与ARM包,也下载好了STM32固件库。准备在main.c 中写下第一个实验,点亮一个小灯。像51单片机一样直接对引脚赋值是行不通的。GPIO还需要配置工作模式与最大输出速度。在stm32f中文手册中找到这样一段话。在options 里作如下配置。可以看到GPIO都在APB2中。新建一个工程,添加三个组。

2025-01-23 17:55:56 735

原创 ADC与DAC(PWM)

ADC - Analog to Digital Converter 模数转换器,将一个模拟信号变为数字信号。DAC - Digital to Analog Converter 数模转换器PWM- Pulse Width Modulation 脉冲宽度调制。

2025-01-23 15:27:33 308

原创 51单片机(四)定时器

由TL低5位与TH8位组成,TL第5位溢出向TH进位,TH溢出向TF置溢出标志,触发中断。TL0作为单独计数器,溢出标志位到TF0,TH0作为单独计数器,溢出标志位到TF1。时钟控制寄存器 TCON(Timer Controller)M0M1 = 11, T0 分为两个独立的8位,T1停止计数。TH记录初值,TL溢出后自动重置为TH记录的初值。M0M1 = 00 , 13位计数,M0M1 = 10 , 16位计数。M0M1 = 01, 8位自动重装。TL作低8位,TH作高8位,51单片机有4种工作方式。

2025-01-23 13:55:10 925

Windows上工程组织方式 - dll插件式示例

Windows上工程组织方式 --- dll插件式的简单示例 vistual studio 2022 工程

2025-02-07

stm32f10xx中文参考手册与stm32f101xx,stm32f103xx固件使用手册

stm32f10xx中文参考手册与stm32f101xx,stm32f103xx固件使用手册

2025-01-23

STM8S-固件库IAR工程例子

STM8S_固件库IAR工程例子

2025-01-22

uCOS-II 在89C51上的移植工程

uCOS-II 在89C51上的移植工程,实测可以运行

2025-01-17

51单片机的hex反汇编工具

51单片机的hex反汇编工具

2025-01-10

Linux编程-清华大学出版社2019年1月第1版

Linux脚本编写与Linux后端应用开发

2024-12-19

空空如也

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

TA关注的人

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