自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 GCC编译器

1、安装ARM交叉编译工具链:这通常包括arm-none-eabi-gcc(用于裸机或没有操作系统的ARM设备)或arm-linux-gnueabihf-gcc(用于运行Linux的ARM设备,gnueabihf表示硬浮点ABI和GNUC库)。如果您的目标平台与编译平台不同(例如,您正在Windows上为Linux编译代码,或者为ARM架构编译代码),则您需要使用交叉编译工具链,并指定正确的目标架构。这通常通过-I选项指定头文件搜索路径,和-L选项指定库搜索路径,以及-l选项指定要链接的库来实现。

2025-01-07 11:38:05 592

原创 gettext库实现国际化

在Windows系统上使用CMake编译一个包含gettext库的C++工程以实现国际化,涉及以下几个步骤。gettext是一个用于国际化(i18n)和本地化(l10n)的库,它允许你的程序支持多种语言。

2024-12-02 15:33:42 528

原创 Flex和Bison

Flex和Bison是Linux和Unix环境下强大的工具,分别用于生成词法分析器和语法分析器。它们在编译器设计、文本处理等领域有着广泛的应用。Flex通过正则表达式进行词法分析,而Bison则通过上下文无关文法进行语法分析。两者通常一起使用,以构建完整的编译或解析过程。

2024-07-17 14:08:06 828

原创 EtherCAT总线

如上图所示,在一个通讯周期内,主站发送以太网数据帧到各个从站,数据帧到达从站后,每个从站根据寻址提取数据帧内对应的数据,并把反馈数据写入到数据帧中,当数据发送到最后一个从站后返回,并通过第一个从站返回到主站。②在开放模式中,EtherCAT的主站和从站网段都连接到同一个标准的以太网交换机上,而且每个EtherCAT从站网段的第一个从站设备都有一个代表整个从站网段的MAC地址,这个从站成为段地址从站。在这种模式下,主站发送EtherCAT报文的时候,以太网帧头的目的地址应该设置为目的从站网段的段地址。

2024-07-06 15:20:20 2800 1

原创 CAN总线协议

CAN总线协议是一种支持分布式控制系统的串行通讯协议,能够实现不同设备之间的实时数据交换。它以高可靠性、实时性、灵活性,在汽车电子、工业自动化、船舶、医疗设备等领域得到广泛应用。

2024-07-05 19:14:33 999

原创 C++ 多进程多线程间通信

请注意,这里的互斥锁是在全局命名空间中创建的(通过前缀"Global\\"),这意味着它可以在系统范围内的任何进程中访问。这是必需的,因为我们的目标是让多个不同的进程能够识别并访问同一个互斥锁。请注意,我们使用了全局命名的信号量(通过前缀Global\),这意味着信号量在整个系统中都是可见的,可以被任何进程访问。特点:它是最快的进程间通信方式,避免了数据的拷贝,但共享内存需要解决并发访问和同步问题,常用的同步机制包括互斥锁(Mutexes)、信号量(Semaphores)和事件(Events)等。

2024-07-05 15:57:20 2808

原创 OpenGL的学习之路

3、还可以使用QPainter将2D图形绘制到QOpenGLWidget子类上。在paintGL()中,不是发出OpenGL命令,而是构建一个用于部件的QPainter对象(注意QPainter没调用OpenGL渲染)。1、重写initializeGL()和resizeGL()函数来设置OpenGL状态并提供透视图转换。1、直接从OpenGLContext::functions()中获取。2、重写paintGL()来绘制3D场景,只调用OpenGL函数。2、创建MyOpenGLWidget.cpp。

2024-07-04 17:31:53 425

原创 C++ 文件读写

在C++中读写INI文件通常不是标准库直接支持的功能,但你可以使用第三方库或编写自己的解析器来处理INI文件格式。C++标准库并没有直接支持读写Excel文件(如.xlsx或较老的.xls格式)的功能,因为这些文件通常包含复杂的结构和元数据,远超出了CSV或纯文本文件的范畴。请注意,这个例子没有处理所有可能的INI文件边缘情况,但它为基本的读写功能提供了一个出发点。在C++中读写XML文件,通常需要使用专门的库,因为C++标准库并没有直接提供对XML的支持。),它是一个简单、小巧但功能强大的XML解析器。

2024-06-29 10:30:53 1630

原创 Qt的学习之路

在 Qt 中,信号使用 signals 关键字定义,而槽使用 slots 关键字定义。它们都必须是类的成员函数。

2024-06-25 17:43:10 1578

原创 C++ 内存管理

newdelete。

2024-06-24 15:15:57 554

原创 C++ 检查内存泄漏

是由Microsoft的调试运行时库(CRT)处理的,并且它本身不直接将信息输出到Visual Studio的输出窗口。操作符来检查内存泄漏并输出到输出窗口(通常是“输出”面板)并不是直接支持的,因为。函数的末尾或你的应用程序的关闭逻辑中完成的。此函数会输出到调试输出窗口。在Visual Studio中,通过定义自定义的。函数来报告内存泄漏。操作符的调试版本(如使用。在程序结束前,你可以调用。

2024-06-24 14:13:22 343

原创 数据库SQL

9、SELECT ... GROUP BY 语句 - 结合聚合函数,按一个或多个列对结果集进行分组。6、ALTER TABLE 语句 - 修改表结构(例如,添加、删除或修改列)10、SELECT ... JOIN 语句 - 从两个或多个表中检索数据。8、SELECT ... ORDER BY 语句 - 对结果集进行排序。2、INSERT INTO 语句 - 向表中插入新数据。1、SELECT 语句 - 从表中检索数据。3、UPDATE 语句 - 更新表中的数据。4、DELETE 语句 - 从表中删除数据。

2024-06-20 11:55:57 336

原创 C++ 图像处理

OpenCV提供了丰富的图片处理功能。

2024-06-20 10:34:37 1177

原创 C++ 音视频传输

在C++中实现音视频传输是一个相对复杂的任务,通常涉及到多个步骤和组件,包括音视频采集、编码、传输(如网络传输)、解码和播放。音视频采集对于视频,可以使用OpenCV(Open Source Computer Vision Library)或DirectShow(Windows平台)来捕获摄像头的视频流。对于音频,可以使用PortAudio、ALSA(Linux Audio System)或Windows Core Audio来捕获麦克风的音频流。音视频编码。

2024-06-20 09:55:49 1706

原创 C++/Qt 问答

如果信号和槽在同一线程且使用直接连接,槽函数会立即执行,它会阻塞发送信号的线程,直到槽函数执行完毕。如果信号和槽不在同一线程或使用队列连接,信号发出后,槽函数的执行会被放入接收线程的事件队列中,不会立即阻塞发送信号的线程。阻塞队列连接方式下,发出信号后,当前线程(信号的线程)会阻塞,等待槽函数在槽函数对象所在的线程中执行完毕后才继续执行。当一个信号被发射时,槽函数不会立即被调用,而是被放入接收对象所在线程的事件队列中,等待事件循环处理。通过信号和槽,发送对象发出信号,接收对象接收信号,并执行特定的槽函数。

2024-06-20 08:57:41 504

原创 C++ 撤销重做

命令模式允许你将操作封装为对象,这些对象可以被存储、排队、参数化、传递、调用,并且可以支持撤销(undo)和重做(redo)操作。它允许你管理一系列的命令(通常是 QUndoCommand 或其子类),这些命令可以被执行、撤销或重做。在实际应用中,你可能需要处理更复杂的场景,比如命令之间的依赖关系、命令的合并、命令的持久化存储等。这会将命令添加到栈中,但不会立即执行它。此外,你也可以考虑使用现有的库来实现redo/undo功能,例如Qt框架中的QUndoStack类,它提供了更高级别的抽象和更多的功能。

2024-06-18 11:38:28 775

原创 C++ 设计模式

在C++中,设计模式(Design Patterns)是用于解决在软件设计中经常遇到的一些通用问题的最佳实践。这些设计模式是在多年的软件开发过程中积累下来的经验和智慧的结晶。定义一个操作中的算法的框架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤。将一个类的接口转换成客户端所期望的另一种接口,从而使得原本由于接口不兼容而无法一起工作的类能够一起工作。将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

2024-06-18 09:38:17 2002

原创 Qt 插件框架

Qt 的插件系统还支持插件的自动注册和发现。这样,主程序就可以在不指定插件路径的情况下自动加载插件。接下来,你需要创建一个或多个插件,这些插件将实现你在第一步中定义的接口。最后,你需要确保你的插件和主程序都正确编译,并且插件库被放置在主程序可以访问的位置。在你的插件实现文件中,你需要使用 Q_EXPORT_PLUGIN2 宏来导出你的插件类。首先,你需要定义一个或多个接口类,这些类将作为插件和主程序之间的契约。在Qt框架中实现插件系统主要涉及到使用Qt的插件机制来动态加载和卸载插件模块。

2024-06-17 19:35:13 874

原创 C++ 智能指针

C++标准库提供了几种不同类型的智能指针,包括std::unique_ptr、std::shared_ptr、std::weak_ptr和std::auto_ptr(但std::auto_ptr在C++11及以后的版本中已被废弃)。std::weak_ptr是对std::shared_ptr的一个补充,它持有对对象的弱引用,这意味着它不会增加对象的引用计数。std::auto_ptr是C++98中引入的一个智能指针,但在C++11及以后的版本中已被废弃,因为它存在所有权转移的问题,可能导致意外的行为。

2024-06-17 16:48:48 393

原创 C++ 线程池

在C++中,线程池是一种用于管理和复用线程的机制,以减少线程创建和销毁的开销,并提高系统的响应速度和吞吐量。任务调度:从任务队列中取出任务并分配给空闲线程执行。线程管理:创建、启动、管理和销毁线程。线程池大小:确定线程池中线程的数量。任务队列:用于存储待执行的任务。

2024-06-17 11:48:49 518

原创 C++ 数据结构

这些数据结构在C++中都有广泛的应用,并且C++的STL(Standard Template Library)提供了丰富的模板类来实现这些数据结构,如。C++支持多种数据结构,这些数据结构根据它们组织数据的方式和访问数据的方式可以分为不同的类型。(红黑树实现的集合)等。(红黑树实现的映射表)、

2024-06-14 14:44:45 750

原创 分布式管理

分布式管理是指在一个由多个独立计算机节点组成的分布式系统中,通过对这些节点的资源、服务、数据进行统一的协调、控制和优化,以实现整个系统的高效、稳定、可靠运行。通过分布式管理,云计算平台能够实现对计算、存储和网络资源的统一管理和调度,为用户提供弹性、高效的云服务。:在物联网应用中,分布式管理能够实现对大量传感器、设备和数据的连接、管理和分析,为物联网应用提供可靠、高效的支持。:在大数据处理和分析领域,分布式管理能够实现对大规模数据集的分布式存储、处理和查询,提高数据处理的效率和准确性。

2024-06-14 14:26:59 1046

原创 QStyledItemDelegate的使用方法

如果你需要更精细地控制项的绘制或数据处理,你可以重写 paint、sizeHint 等方法。你也可以使用 setItemEditorFactory 来设置自定义的编辑器工厂,以创建特定的编辑器小部件。

2024-06-13 15:33:15 918

原创 CMake的学习之路

CMake是一个跨平台的自动化建构系统,它使用一种人类可读的配置文件(CMakeLists.txt)来控制软件编译过程。

2024-06-11 20:12:33 848

原创 Makefile的学习之路

1、简介makefile是一个用于自动化构建程序的脚本文件,它包含一组规则,这些规则描述了如何从一个或多个源文件(如.c/.cpp文件)编译生成目标文件(如.o文件)再链接生成可执行文件(如.exe文件)或库(如.dll文件)。makefile的好处就是自动编译,只需一个make命令就能完成整个工程的编译。gcc:可以简单的认为是编译器,它可以编译多种语言(如C、C++、Java等)。

2024-06-11 17:42:56 720

原创 正则表达式

字符分枝多用于满足不同情况的选择,用“|”将不同的条件分割开来,比如有些固定电话区号有三位,有些有四位,这个时候可以采用字符分枝。例如:\d{3}-\d{8}|\d{4}-\d{8} 可以匹配两种不同长度区号的固定电话。字符分组多用于将多个字符重复,主要通过使用小括号()来进行分组。形如:(\d\w){3} 重复匹配3次(\d\w)

2024-04-30 15:42:33 132

原创 UML类图

聚合(Aggregation)是关联关系的一种特例,它体现的是整体与部分的拥有关系,此时整体与部分之间是可分离的,部分可以属于多个整体对象,也可以为多个整体对象共享。泛化关系(Generalization)是指对象与对象之间的继承关系,泛化(继承)关系是对象之间耦合度最大的一种关系,表示一般与特殊的关系,是父类与子类之间的关系。接口在类图中也是用矩形框表示,但是与类的表示法不同的是,接口在类图中的第一层顶端用构造型 表示,下面是接口的名字,第二层是方法。实现关系是指接口及其实现类之间的关系。

2024-04-22 17:05:29 1136

原创 中国历史长河

中国古代史,始于大约170万年前的,止于1840年的鸦片战争前,是中国和的历史。中国近代史,始于1840年,止于1949年前,这也是中国的历史。中国近代史分为前后两个阶段,从1840年鸦片战争到1919年前夕,是阶段;从1919年五四运动到1949年中华人民共和国成立前夕,是阶段。中国现代史,始于1949年10月1日中华人民共和国的成立,标志着中国进入了社会主义革命和建设时期。

2024-04-17 14:23:48 1672

原创 Python的学习之路

字符串中使用反斜杠'\'可用来转义,如'\n'可转义为换行,但使用r可以让反斜杠不发生转义,如:r"this is a line with \n" 此时\n会显示,并不会换行。Python2中默认编码为ASCII,Python3中默认编码为UTF-8,如需指定编码则在开头加入# -*- coding: UTF-8 -*- 进行指定。集合(set)中的值不可重复,且无序。Python中的数据结构字典(dict),它的内容以键值对的形式存在,dict拥有良好的查询速度,其中的值可以是任意Python对象。

2024-04-08 19:23:26 730

原创 C++ 消息队列

需要注意的是,这个实现是基本的,并且可能不适合所有用例。例如,它并没有处理生产者或消费者过多的情况,这可能导致队列的大小无限增长。在实际应用中,你可能需要添加一些额外的逻辑来处理这种情况,例如限制队列的大小,或者在队列满时阻塞生产者。在C++中,并没有直接提供消息队列(Message Queue)的标准库实现。等工具自己实现一个简单的线程安全消息队列。这个实现允许你在多线程环境中安全地推送和弹出消息。方法,该方法尝试从队列中弹出消息,如果队列为空,则返回。操作,以及在有新消息时通知等待的线程。

2024-04-02 15:17:02 1206

原创 C++ Boost库

(注意:包含头文件的时候需要有boost目录,即#include "boost/logic/tribool.hpp",而不能是#include "logic/tribool.hpp")剩下的少量库(如chrono、date_time、program_options、test、thread等)必须编译成静态库或动态库,并在构建时指定链接选项才能使用。实际上b2是bjam语言的解释器,它查找当前目录下的jamfile,并向上查找jamroot,解释执行其中的bjam语句,最终完成软件的构建。

2024-03-07 16:44:20 488

原创 C++ 标准模板库(STL)

映射,存放键值对(key-value),关联型容器,内部用红黑树实现,默认排序按照键的ASCII码顺序排列。栈,先进后出,后进先出。优先队列,在堆空间开辟内存,是在正常队列的基础上加了优先级,保证每次的队首元素都是优先级最大的。集合,元素不会重复,当插入已有元素时,并不会插入进去,元素自动从小到大排序。(产生一个额外的键值对空间),所以为了不增加额外的空间负担,最好使用前两种方法。容器的大小是固定的,无法动态的扩展或收缩,只允许访问或者替换存储的元素。的排序规则和优先队列的排序规则是相反的就可以了。

2024-03-06 17:02:36 1238

原创 ODD设计原则

OOD七大原则

2022-08-31 17:37:16 1592

原创 QTreeView节点拖放

QTreeView自定义model节点拖放

2022-08-05 17:50:56 4028 7

原创 find和find_if用法

一、find的用法STL容器中有很多find,比如说set,map。他们内部都有内置的find函数,一般情况下,如果我们用到这些容器,那么我们直接用它的内置find就可以了。(这是因为map和set中内置的find函数比std::find时间复杂度要低,速度更快)。但是像list,vector这些容器是没有find函数的,所以我们只能用默认的std::find来进行查找。首先说一下find函数的原型:template<class InputIterator, class T>Inpu

2022-05-20 10:19:49 3391 1

原创 Qt编码注意事项

信号和槽连接时候不能写上参数名称:例如connect(table,SIGNAL(valueChanged(int row, int col)), this, SLOT(slot_valueChanged(int row, int col))) 会造成信号和槽连接不上,connect函数结果返回false。正确的写法是:connect(table, SIGNAL(valueChanged(int, int)), this, SLOT(slot_valueChanged(int, int)))另外..

2022-04-27 09:02:26 430

转载 Qt中qss样式表

qss样式表是用于设置QT程序UI界面中控件的背景图片、大小、字体颜色、字体类型、按钮状态变化等属性,美化UI界面,实现界面和程序的分离,可以快速切换皮肤。1、基本语法selector {attribute:value}/**************************************************************//* 说明: *//* select...

2022-04-14 11:50:49 4142

原创 三菱PLC MC协议

1、MC协议的目的:允许外部设备读写PLC内部寄存器。2、协议格式:通讯方式有RS485和TCP/IP两种,通讯格式有很多种:3E、3C、4C、4E帧格式,通讯内容分为二进制和ASCII文本,本文主要介绍TCP/IP + 3E + 二进制通信方式。发送帧格式:响应帧格式:举例说明:指令为向软元件D7000写入值H000C发送帧内容为:50 00 00 FF FF 03 00 0E 00 10 00 01 14 00 00 58 1B 00 A8 01 00 0C 00.

2022-04-13 11:57:36 23010 2

原创 死锁的四个必要条件以及处理策略

一、什么是死锁死锁是指两个或两个以上的进程(线程)在运行过程中因争夺资源而造成的一种僵局。例如,某计算机系统中只有一台打印机和一台输入设备,进程P1正占用输入设备,同时又提出使用打印机的请求,但此时打印机正被进程P2 所占用,而P2在未释放打印机之前,又提出请求使用正被P1占用着的输入设备。这样两个进程相互无休止地等待下去,均无法继续执行,此时两个进程陷入死锁状态。关于死锁的一些结论:参与死锁的进程数至少为两个;参与死锁的所有进程均等待资源;参与死锁的进程至少有两个已经占有资源;死锁会浪

2022-04-10 13:11:34 32150

原创 多线程异步日志打印系统--双缓冲机制

多线程异步日志打印,满足以下要求情况下,如何才能更高效?(1)线程安全:多个线程可以并发写日志,不造成竞争,两个线程的日志信息不会交叉出现;(2)吞吐量大;(3)日志消息有多种级别,格式可配置等等;双缓冲机制的基本思路是:准备两块 buffer: A 和 B;前端负责往 buffer A 填数据(日志信息);后端负责把 buffer B 的数据写入文件。当 buffer A 写满之后,交换 A 和 B,让后端将 buffer A 的数据写入文件,而前端则往 buffer B

2022-04-09 15:29:06 1526

空空如也

空空如也

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

TA关注的人

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