- 博客(45)
- 收藏
- 关注
原创 C语言经典笔试题目分析(持续更新)
本文主要讨论了C语言中的几个关键概念和代码实现。首先,解释了static关键字在函数和局部变量中的不同含义:用于函数时限制其作用域为当前文件,用于局部变量时延长其生命周期。接着,通过代码示例分析了全局变量的初始化和函数调用对变量的影响,指出a的值最终为3。然后,详细说明了32位单片机系统中结构体的内存对齐规则,并计算了两个结构体的长度分别为8字节和12字节。此外,介绍了如何使用typedef定义函数指针类型,并通过指针调用函数。最后,提供了宏定义实现位操作和数组元素个数计算的方法,并实现了一个将十六进制数转
2025-05-15 21:20:03
856
原创 Linux通信开发muduo网络库学习笔记
muduo库是一个基于非阻塞IO和IO多路复用的C++高并发TCP网络编程库,采用Reactor模式实现,支持多线程并发处理。其核心架构为“one loop per thread”,每个线程拥有独立的事件循环(EventLoop),主线程负责监听新连接,子线程处理具体连接事件。muduo库的主要组件包括TCPServer、EventLoop、TcpConnection、TcpClient和Buffer类,分别用于管理服务器、事件循环、连接、客户端和数据缓冲区。通过muduo库,开发者可以将业务逻辑与网络层解
2025-05-15 16:44:00
768
原创 c++ std库中的文件操作学习笔记
C++标准库中的 <fstream> 头文件提供了 std::ifstream、std::ofstream 和 std::fstream 类,分别用于文件读取、写入及同时读写操作。这些类继承自 std::istream、std::ostream 和 std::iostream,提供了类型安全的文件操作接口。std::ifstream 用于读取文件,std::ofstream 用于写入文件,std::fstream 支持同时读写。文件可以通过构造函数或 open() 函数打开,并支持多种打开模式组合
2025-05-13 23:05:09
1307
原创 Redis学习笔记
Redis是一种高性能的内存数据结构存储系统,广泛应用于缓存、会话存储、消息队列、实时分析等场景。它支持多种数据结构如字符串、哈希、列表、集合等,并提供丰富的操作命令。Redis基于内存存储,具有极高的读写速度,同时也支持持久化机制(RDB和AOF)来确保数据安全。其单线程架构简化了并发控制,提升了效率。此外,Redis通过哨兵和集群机制实现了高可用性和水平扩展。在实际应用中,Redis常被用作消息队列,开发者在使用时需注意发布与订阅命令需在不同的上下文中执行,以确保消息的跨服务器通信。通过合理配置和使用,
2025-05-13 22:20:21
964
原创 YOLOv8训练过程与结果评价指标分析
训练完成后产生的文件如下首先我们需要明确精确率与召回率,即分别反映预测准确性和正类覆盖能力。精确率关注预测结果中正确识别的比例,召回率侧重真实正类中被正确找出的比例。两者常需权衡,具体应用场景决定侧重方向。**精确率(Precision)**衡量模型预测为正类的样本中真实正类的比例。其计算公式为:精确率=TP/(TP+FP),其中TP为真正例(预测正确且实际为正类的样本),FP为假正例(预测错误但实际为负类的样本)。
2025-05-09 22:05:20
1104
原创 OPCUA,OPCDA与MODBUS学习笔记
OPC协议(OLE for Process Control,即过程控制的OLE)是一种标准化的通信协议,旨在帮助不同厂商的设备、控制系统和软件之间进行数据交换。OPC协议的目标是提供一种统一的接口,使得各种不同品牌、类型的硬件设备可以方便地与上层软件(如SCADA系统、HMI界面、监控系统等)进行无缝对接。OPC协议最初由Microsoft和一批工业自动化厂商合作开发,基于Windows平台,目的是为了解决传统工业控制系统中不同硬件和软件之间的兼容性问题。OPC协议如今已经发展出了多个版本
2025-05-08 22:54:32
961
原创 Lua学习笔记
Lua是一种轻量级的、高效的、可扩展的脚本语言,由巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de Janeiro)的一个小团队开发。Lua的设计目标是成为一种嵌入式的脚本语言,因此它的语法简单、易于学习、易于嵌入其他程序中,并且运行速度非常快。所以Lua是一种上手成本很低的脚本语言。这里放下Lua代码与注释,方便快速上手,下再详细介绍--注释方式--[[多行注释--]]
2025-05-08 21:40:29
925
原创 nginx配置集群服务器中的tcp负载均衡器
假设一台机器支持两万的并发量,现在我们需要保证八万的并发量。首先想到的是升级服务器的配置,比如提高 CPU 执行频率,加大内存等提高机器的物理性能来解决此问题。但是单台机器的性能毕竟是有限的。这个时候我们就可以增加服务器的数量,将用户请求分发到不同的服务器上分担压力,这就是负载均衡。那我们就需要有一个第三方组件充当负载均衡器,由它负责将不同的请求分发到不同的服务器上。这里介绍Nginx的负载均衡功能。Nginx作为tcp把client的请求按照负载算法分发到具体的业务服务器ChatServer上能够。
2025-04-29 17:28:34
802
原创 Linux开发中的线程管理(C++11 std::thread)
std::thread 是 C++11 引入的一个类,是 C++11 标准库中的一个关键特性,它提供了一种在 C++ 程序中创建和管理线程的方法。通过使用 std::thread,可以很容易地在你的 C++ 程序中创建多线程应用程序。每个 std::thread 对象都代表了一个独立的执行线程,这些线程可以并行地执行不同的任务。
2025-04-29 15:40:09
974
原创 Linux环境变量配置与std访问环境变量
首先介绍一下Linux下各目录操作符的含义:~/.bashrc-~” :表示主目录,也就是当前登录用户的用户目录。“/” :是指根目录:就是所有目录最顶层的目录。“./” :表示当前目录,./ 一般需要和其他文件夹或者文件结合使用,指代当前目录下的东西。“. .” :表示上级目录“/.” :隐藏文件前会带.如.bashrc作用域与类型类型生效范围配置文件生命周期临时变量当前Shell会话 无(命令行设置)终端关闭失效用户变量单用户所有会话用户登录加载系统变量。
2025-04-28 21:31:50
985
原创 池类设计的常客,单例模式
单例模式(Singleton),也叫单子模式,是一种常用的软件设计模式。在应用这个模式时,单例对象的类必须保证只有一个实例存在。许多时候整个系统只需要拥有一个全局对象,这样有利于我们协调系统整体的行为。比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置信息。这种方式简化了在复杂环境下的配置管理。
2025-04-28 15:29:24
1041
原创 C++11线程间通信同步与Linux中MySQL连接池实现
适用场景生产者-消费者队列:队列空/满时的线程同步。任务调度:线程池中任务的分发与执行。资源池管理:如数据库连接池的分配与回收。与信号量的区别特性条件变量信号量C++标准支持C++11C++20灵活性需手动管理条件,更底层直接通过计数器控制资源访问适用场景复杂条件判断(如队列空/满)简单资源计数限制协作机制需结合互斥锁和条件检查独立的计数操作(acquire/release)条件变量是 C++11 多线程编程中实现复杂同步逻辑的核心工具。
2025-04-27 18:43:53
989
原创 c/c++中常用循环的执行逻辑
在C++(以及C、Java等类似的语言)中,和虽然在表面上看起来相似,但它们在循环执行和条件判断方面有着显著的不同。这种差异主要体现在循环的起始条件和循环体执行后索引值的变化上。
2025-04-21 20:24:17
573
原创 QTcpSocket多线程遇到的读写数据问题
可以连接到服务器,但是先调用write发送数据后,readyRead信号一直不进它的槽函数。表示这里发送失败了,客户端发不出数据了~方法,就可以获取readyRead信号了。问题是当需要给服务器发送一段命令时(使用。来连接TCP服务器并给服务器发送数据。方法后,可以把缓冲的数据立刻发送出去。方法是带有缓冲的,将接收部分阻塞了。估计QTcpSocket中的。qt的官方文档里说,调用了。
2025-04-19 16:49:48
161
原创 JSON学习笔记
JSON(JavaScript Object Notation,JavaScript对象表示法)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。我们最常使用的存储数据的方式有很多,比如利用txt文件存,利用xml存,利用word存,利用Excel存,如果我们要求比较高,还可以使用数据库存。(2)父子节点的形式,这种方法可以定义更为复杂的形式,缺点就是定义起来较为麻烦。在一级对象后直接跟不同的二级对象作为区分,并针对二级对象进行赋值或添加的操作。定义的JSON数据结构如下。
2025-04-19 16:45:30
331
原创 GNU,GDB,GCC,G++是什么?与其他编译器又有什么关系?
首先GNU是什么呢,GNU计划,又称革奴计划,是由Richard Stallman在1983年9月27日公开发起的。它的目标是创建一套完全自由的操作系统。因为当时1969年在贝尔实验室诞生的Unix是商业操作系统。
2025-04-19 15:08:53
725
原创 C++学习:std::function与std::bind
在C++工程实践中,bind绑定器和function函数对象非常的重要,依靠他们可以便捷的实现松耦合。
2025-04-18 18:07:58
750
原创 CMake的配置使用
gcc或g++的编译指令如下1即为生成的文件可以是可执行文件或.a静态库.so动态库,2为生成的命令,生成什么文件,3要编译的文件名,4为头文件包含目录,5为库目录路径,6为库文件名-lmuduo_net即为-l muduo_net实际上稍微大一些的项目用g++编译还是比较麻烦的,用cmake的来进行构建会便捷一些使用简单方便,可以跨平台,构建项目编译环境。尤其比直接写Makefile简单(在构建大型工程编译时,需要写大量的文件依赖关系),可以通过简单的CMake生成负责的Makefile文件。
2025-04-16 21:18:44
943
原创 【Yolov8部署】 VS2019 + opencv + onnxruntime 环境下部署目标检测模型
本文主要研究场景为工业场景下,在工控机与工业相机环境中运行的视觉缺陷检测系统,因此本文主要目的为实现c++环境下,将yolov8已训练好的检测模型使用onnxruntime 部署通过cpu或gpu cuda加速进行检测运算。
2025-03-31 21:01:04
983
原创 【Yolov8部署】 VS2019 + opencv - dnn CPU环境下部署目标检测模型
本文主要研究场景为工业场景下,在工控机与工业相机环境中运行的视觉缺陷检测系统,因此本文主要目的为实现c++环境下,将yolov8已训练好的检测模型部署在opencv中通过cpu进行检测运算如下为成功运行例程,检测图像涉及科研项目,此处不便展示。
2025-03-27 21:48:43
736
原创 QT网络通信的接口与使用
在Qt中实现TCP通信主要依赖 QTcpServer(服务端)和 QTcpSocket(客户端和服务端通信)类。TCP/IP通信(即SOCKET通信)是通过网线将服务器Server端和客户机Client端进行连接,在遵循ISO/OSI模型的四层层级构架的基础上通过TCP/IP协议建立的通讯。控制器可以设置为服务器端或客户端。服务端(简化版)Q_OBJECTpublic:private:客户端(简化版)Q_OBJECTpublic:private:运行效果。
2025-03-24 20:40:47
738
原创 c++中的四种cast转换
C++继承并扩展C语言的传统类型转换方式,提供了功能更加强大的转型机制(检查与风险)C++11之后,C++中就有四种类型转换,分别是,一般用这四种强制转换可以替代在c代码中类似(int)这种方式的转换。如这个表达式将expression转换为一个type-id类型的对象。Type-id必须是一个指针、指向一个已经定义类的类型或一个指向 VOID 的指针。Expression的类型必须是一个指针,如果type-id是一个指针;当type-id是一个引用的时候必须是一个左值。
2025-03-24 17:02:46
950
原创 MySQL学习笔记(四)
介绍视图(View)是一种虚拟存在的表。视图中的数据并不在数据库中实际存在,行和列数据来自定义视图的查询中使用的表,并且是在使用视图时动态生成的。通俗的讲,视图只保存了查询的S0L逻辑,不保存查询结果。所以我们在创建视图的时候,主要的工作就落在创建这条5QL查询语句上。全局锁就是对整个数据库实例加锁,加锁后整个实例就处于只读状态,后续的DML的写语句,DDL语句,已经更新操作的事务提交语句都将被阻塞。其典型的使用场景是做全库的逻辑备份,对所有的表进行锁定,从而获取一致性视图,保证数据的完整性。
2025-03-24 16:19:57
1070
原创 MySQL学习笔记(三)
连接层:最上层是一些客户端和链接服务,主要完成一些类似于连接处理、授权认证、及相关的安全方案。服务器也会为安全接入的每个客户端验证它所具有的操作权限。服务层:第二层架构主要完成大多数的核心服务功能,如QL接口,并完成缓存的查询,SQL的分析和优化,部分内置函数的执行。所有跨存储引擎的功能也在这一层实现,如 过程、函数等。引擎层:存储引擎真正的负责了MySQL中数据的存储和提取,服务器通过AP!和存储引擎进行通信。不同的存储引擎具有不同的功能,这样我们可以根据自己的需要,来选取合适的存储引擎。存储层。
2025-03-24 15:00:49
988
原创 QT线程同步
多线程编程的一个主要挑战是避免数据竞争和条件竞争。数据竞争发生在多个线程同时读写共享数据,而没有适当的同步机制时。条件竞争是指多个线程以特定的时序执行特定的操作,导致不期望的结果。同步策略在保护线程安全的同时,也可能会引入额外的性能开销。例如,锁的不当使用可能导致线程争用,从而降低效率。锁的粒度:选择合适的锁粒度,以减少争用和上下文切换的开销。锁的类型:根据应用场景选择互斥锁、读写锁(QReadWriteLock)、递归锁(QRecursiveMutex)等。
2025-02-25 21:50:09
1008
原创 cpp智能指针的原理与使用
智能指针不是指针,是一个管理指针的类,用来存储指向动态分配对象的指针,负责自动释放动态分配的对象,防止堆内存泄漏和空悬指针等等问题。动态分配的资源,交给一个类对象去管理,当类对象声明周期结束时,自动调用析构函数释放资源。智能指针的历史历程:C++ 98 中产生了第一个智能指针auto_ptr。C++boost给出了更加实用的scoped_ptr(防止拷贝) 和 shared_ptr(引进引用计数) 和 weak_ptr。
2025-02-25 21:49:24
919
原创 QT控件与提升(自定义类)
在Qt开发中,控件提升是一个实用但常被低估的概念。它通过将标准的基础控件(Base Widget)升级为功能更强大、更定制化的自定义控件(Custom Widget),从而允许开发者在设计界面时突破Qt基础控件的限制,实现更复杂的功能和更优化的用户体验。这一概念与C++编程中“接口与实现分离”的原则不谋而合。正如Scott Meyers在《Effective C++》中所强调的,这种分离能够增强代码的灵活性和可维护性。
2025-02-19 20:14:27
982
原创 QT线程池介绍与接口使用
在并发编程中,当我们使用线程时,通常的做法是在需要时创建一个新的线程。这种方法实现起来较为简便,但存在一个显著问题:如果并发线程数量较多,且每个线程仅执行一个耗时较短的任务,频繁地创建和销毁线程将显著降低系统效率,因为线程的创建和销毁本身需要消耗一定的时间。那么,是否存在一种机制可以使线程在执行完一个任务后不被销毁,而是能够继续执行其他任务,从而实现线程的复用呢?线程池(Thread Pool)正是这样一种多线程处理模式。在线程池中,任务被添加到队列中,线程池在创建线程后会自动启动这些任务。
2025-01-30 23:19:38
1413
原创 QThread的使用流程与事件循环
事件循环:事件循环的作用:在run()函数中添加事件循环后,run()函数中的内容执行完后,线程还会运作,启动事件循环后,主线程还可以和子线程通过信号与槽的方式继续使用。1.使用exec()来启动事件循环2.exec()后面的内容将不会运行,直到退出事件循环3.使用quit()退出事件循环4.只有槽函数所在线程开启了事件循环,它才能在对应信号发射后被调用5.无论事件循环是否开启,信号发送后会直接进入槽函数所依附的线程的事件队列。
2025-01-10 12:53:28
960
原创 QThread多线程详解
在阅读本文之前,你需要了解进程和线程相关的知识,详情参考《Qt 中的多线程技术》在很多文章中,人们倾向于把 QThread 当成线程的实体,区区创建一个 QThread 类对象就被认为是开了一个新线程,当然这种讨巧的看法似乎能快速的让我们入门但是只要深入多线程编程领域后就会发现这种看法越来越站不住脚,甚至编写的代码脱离我们的控制,代码越写越复杂。最典型的问题就是"明明把耗时操作代码放入了新线程,可实际仍在旧线程中运行"。
2025-01-09 21:41:25
822
原创 MySQL学习笔记(二)
1.概念:约束是作用于表中字段上的规则,用于限制存储在表中的数据。2.目的:保证数据库中数据的正确、有效性和完整性。对字段数据约束id int primary key auto_increment '主键',name varchar(10) not null unique comment '姓名',age int check (age >0 && age
2025-01-08 17:28:55
666
原创 MySQL学习笔记(一)
MySQL启动与停止DML英文全称是Data Manipulation Language(数据操作语言),用来对数据库中表的数据记录进行增删改操作。DQL英文全称是Data Query Language(数据查询语言),数据查询语言,用来查询数据库中表的记录。DCL英文全称是Dala ControlLanguaqe(数据控制语言),用来管理数据库用户,控制数据库的访问权限制。
2024-12-24 17:45:18
1024
原创 设计模式c++(二)
重构技法静态 ->动态早绑定 ->晚绑定继承 ->组合编译时依赖 ->运行时依赖紧耦合 -> 松耦合设计模式最频繁使用的结构未框选模式在设计中使用的比较多什么时候不用模式代码可读性很差时需求理解还很浅时变化没有显现时不是系统的关键依赖点项目没有复用价值时项目将要发布时经验之谈不要为模式而模式关注抽象类 &接口理清变化点和稳定点审视依赖关系要有Framework 和Application的区隔思维>良好的设计是演化的结果设计模式成长之路。
2024-12-04 20:28:31
1115
原创 设计模式c++(一)
在软件系统中,经常面临着“一系列相互依赖的对象”的创建工作;同时,由于需求的变化,往往存在更多系列对象的创建工作。如何应对这种变化?如何绕过常规的对象创建方法(new),提供一种“封装机制”来避免客户程序和这种“多系列具体对象创建工作”的紧耦合?提供一个接口,让该接口负责创建一系列“相关或者相互依赖的对象”,无需指定它们具体的类。如果没有应对“多系列对象构建”的需求变化,则没有必要使用Abstract Factory模式,这时候使用简单的工厂完全可以。
2024-12-03 21:40:26
1283
原创 Linux多进程学习笔记(六)Socket
跨主机传输要注意的问题1字节序问题大端:低地址处放高字节小端:低地址处放低字节主机字节序:host网络字节序:network解决:_ to _ _ :htons,htonl,ntohs,ntohl字节序问题(Byte Order Issue),也称为端序问题(Endianness Issue),是指在不同计算机系统中数据的字节排列顺序的差异。这主要涉及到多字节数据类型(如整数、浮点数等)在内存中的存储顺序。
2024-11-12 21:44:27
722
原创 Linux多进程学习笔记(五)进程间通信
在多线程编程中,线程间通信(Inter-Thread Communication,ITC)是必不可少的。共享内存消息传递信号量(Semaphores)互斥锁(Mutexes)条件变量(Condition Variables)屏障(Barriers)读写锁(Read-Write Locks)事件(Events)信号(Signals)共享变量内存映射文件(Memory-Mapped Files)套接字(Sockets)管道(Pipes)数据传输。
2024-11-08 20:45:53
908
原创 Linux多进程学习笔记(四)高级IO
(Input/Output)是一种 I/O 操作模式,其中 I/O 请求不会使发起请求的进程挂起(阻塞),如果请求不能立即完成,而是立即返回一个错误码,通常是 EAGAIN 或 EWOULDBLOCK。writev 是 Linux 系统中的一个系统调用,用于将多个非连续的内存缓冲区中的数据写入文件描述符,这个过程被称为“聚集写”(gather write)。通过 mmap,进程可以直接访问文件内容,就好像它们是内存的一部分一样,这可以提高文件 I/O 操作的效率。
2024-11-04 16:23:08
847
原创 QT对象模型
标准 C++对象模型(C++ object model)非常高效地支持对象范式(object paradigm)。然而在某些方面却表现不足,比如信号的传递、事件的传递和处理等。GUI编程既要求运行时的高效性又需要有更好的灵活性。Qt GUI编程语言结合了Qt对象模型(Qt Object Model)的灵活性,以及标准 C++运行时的高效性。为了更好地满足 GUI图形用户界面编程,Qt的对象模型在标准 C++的基础上新增了一些特性:元对象系统(Meta-ObjectSystem),提供。
2024-10-31 16:22:22
928
原创 qt的信号与槽机制
所谓回调,就是事先将一个回调函数(callback function)指针传递给某一个处理过程,当这个处理过程得到执行时,回调预先定义好的回调函数以期实现激活其他处理过程的目的。信号是一个特定的标识:一个槽就是一个函数,与一般的函数不同,槽函数既能够和信号关联,也能够像普通函数一样直接调用。在程序中,使用QObject:connect0函数来将某个信号和某个槽进行关联,而信号和槽之间的真正关联是由Qt的信号和槽机制来实现的。除了能够在程序中手动关联信号和槽之外,Qt的元对象提供了信号和槽的自动关联。
2024-10-30 11:52:35
1241
原创 Linux多进程学习笔记(三)并发(线程)
文章目录线程一、线程的概念二、线程的生命周期1.线程的创建2.线程的终止3.栈的清理4.线程的取消选项5.线程分离三、线程同步1.互斥量2.条件变量3.信号量4.读写锁四、线程属性1.线程的属性2.线程同步的属性五、重入1.线程与信号2.线程与fork六、竞争故障线程一、线程的概念一个正在运行的函数posix线程是一套标准,而不是实现openmp线程线程标识:pthread_t线程ID是用pthread_t数据类型表示,为一
2024-10-28 16:10:58
1065
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人