- 博客(73)
- 收藏
- 关注
原创 C++ 笔记——Nicoym的随记
使用 C++11 标准库使用 POSIX 线程(pthread,Linux/Unix)使用 Windows API(CreateThread)使用 C++ 线程池(C++17 后推荐),如C++17 的 std::jthread协程(C++20 新增)方式优点缺点适用场景跨平台、易用、RAII 支持创建销毁成本高通用多线程任务pthread精细控制(如优先级)仅限 Unix,手动管理Linux 底层开发Windows 原生支持仅限 Windows线程池。
2025-05-01 21:10:32
1044
原创 进程、线程、进程间通信Unix Domain Sockets (UDS)
所有的中断都是从保存寄存器开始,对于当前进程而言,通常是保存在进程控制块中,随后,会从堆栈中,删除由中断硬件机制存入堆栈的那部分信息,并将堆栈指针指向一个由进程处理程序所使用的临时堆栈。在完成有关工作后,大概就会使相关的进程就绪,接着调用调度程序,决定下一个该运行的进程。在进程模型中,计算机上所有可运行的软件,通常也包括操作系统本身,被组织成若干顺序进程,一个进程就是一个正在执行程序的实例,包括程序计算器、寄存器、变量当前值。通过 pipe() 系统调用创建,用于父子进程或兄弟进程间的通信。
2025-04-30 11:10:55
1179
原创 std::bind、 lambda表达式、std::_Bindres_helper
示例1:利用 lambda表达式封装calculate函数,使其第二个参数固定为0.1这里只是为了举例说明lambda表达式的语法!!!
2025-04-29 01:50:05
954
原创 C++ 为什么建议类模板定义在头文件中,而不定义在源文件中
public:// 只有声明void MyTemplate<T>::foo(T x) { /* 实现 */ } // 定义在.cpp中// 链接错误:找不到foo的实例化实现!原因:main.cpp 只看到声明,不知道 foo 的实现,无法实例化 MyTemplate::foo。而 mytemplate.cpp 中的定义未被触发实例化(因为没有代码要求它实例化int版本)。(1)非模板类(普通类)的成员函数在链接时可以通过目标文件(.obj/.o)找到定义。
2025-04-26 21:40:20
894
原创 IOCP---重叠IO套接字为什么比阻塞套接字 更好
异步非阻塞:通过WSA_FLAG_OVERLAPPED标志创建的套接字,I/O操作(如WSARecv())会立即返回,实际操作由内核在后台完成。(1)重叠IO套接字把更多的行为交给内核管理,减少了用户态–内核态的交互次数;通过I/O完成端口(IOCP)或事件对象通知线程操作完成,无需线程主动等待。数据未就绪时:线程阻塞,内核→用户态切换(第2次)数据到达时:内核通过完成端口通知(通常批量处理)数据到达时:内核唤醒线程,再次切换(第3次)发起请求:用户态→内核态(1次)发起请求:用户态→内核态(1次)
2025-04-23 13:39:36
902
原创 R语言——绘制生命曲线图(细胞因子IL5)
(1)加载需要的依赖(2)读取文件(3)预处理文件:保障所需数据的完整性、格式规范;(4)创建对象,拟合生存曲线的数据(5)绘制曲线
2025-04-06 01:44:22
942
原创 C++ 字符处理、编码格式
操作系统编码(如 Windows 的 ACP、Linux 的 LANG)决定了:默认的字符集(如 Windows 中文版默认 GBK,Linux 通常 UTF-8)。系统 API 的行为(如 MessageBoxA 按 ANSI 编码解析字符串)。文本编辑器编码决定的是:文件在磁盘上的存储格式(如 UTF-8、GBK、UTF-16)。如何解析文件内容(避免乱码)
2025-03-28 13:54:32
1143
原创 MFC中的窗口线程安全性与CWnd类
(1)定义消息ID# define WM_SEND_XXX(WM_USER + 1) // WM_USER 是系统预留的自定义消息起点1# define WM_SEND_XXX(WM_USER + 1) // WM_USER 是系统预留的自定义消息起点作用:定义一个唯一的消息标识符,避免与系统消息冲突。为什么用 WM_USER: 0x0400(WM_USER)Windows 保留0x0000 - 0x03FF ,0x0400 (WM_USER) - 0x7FFF是可以自定义使用的范围。
2025-03-25 17:00:24
767
原创 程序编译和执行的流程,初步了解
语法树的节点表示语法规则(如函数定义、返回语句、二元表达式等)。当用户双击一个 .exe 文件或在命令行中执行时,Windows 操作系统的加载器(Loader)会负责加载该可执行文件。使用静态链接库(.lib 文件)而不是动态链接库(.dll 文件),在编译时,将库的代码直接合并到 .exe 文件中。在链接过程中,链接器会将各个目标文件(.o 或 .obj)的 段(Section) 进行整合。各个目标文件的代码区 和 全局区 的布局在编译时确定,而最终(在.exe中)所处的位置在链接时确定。
2025-03-20 13:24:59
797
原创 Linux(socket网络编程)UDP---初学
(3)TCP中套接字是一对一关系,服务端为了和多个客户端通信,要建立多个用于通信的套接字。src_addr:指向存储发送方地址的sockaddr结构的指针。dest_addr:指向包含目标地址的sockaddr结构的指针。MSG_WAITALL:等待接收完整的消息(仅用于TCP)。addrlen:指向存储src_addr长度的变量的指针。2.创建地址结构体,结构体要设置服务器的IP和端口号。3.sendto用于发送;返回值:成功时返回发送的字节数,失败返回-1。addrlen:dest_addr的长度。
2025-02-16 11:53:37
326
原创 Linux(socket网络编程)I/O缓冲、三次握手、四次挥手
(4)上述的状态变化,是基于一个正常完成的TCP三次握手,那要是中间出现什么问题了,比如服务端回复了SYN+ACK,客户端迟迟没有回复ACK;,即客户端伪造很多SYN向服务端请求连接,但刻意不完成第三次握手,占用服务端的连接表、内存等资源。》启用SYN Cookie:服务端接受SYN时不立刻分配内存资源,而是收到客户端的ACK后,验证完成后,才分配内存资源。(2)建立完成后,在后续的数据传递过程中,SEQ也会继续跟随数据段发送,继续递增,用来记录数据段的顺序。没错,各自发送的SEQ值是不一样的。
2025-02-13 14:49:30
1156
原创 Linux(socket网络编程)TCP连接
//绑定IP、端口 memset(&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_addr.s_addr = inet_addr("0.0.0.0"); addr.sin_port = htons(8888); int ret = bind(server, (struct sockaddr*)&addr, sizeof(addr)); if (ret == -1) { close(server); return;
2025-02-12 20:56:31
1019
原创 常量成员函数(C++)
1》提高代码的可读性和安全性,通常用于getter(访问器)方法。2》在多线程编程中,通过const成员函数来避免数据竞争。当然了,不是成员变量就可以修改,(但有什么意义呢…常量成员函数不允许修改成员变量的值;表示该函数不会修改类的成员变量。
2025-01-18 12:50:26
239
原创 C++ 类型转换
向上转型时,比如基类中有成员变量共占12字节,派生类的成员变量占4字节;由于通过基类指针只能访问基类的成员变量,那么就不会出现访问超过目标对象的内存范围的情况;向下转型时,通过派生类指针要访问属于派生类的成员变量,就属于非法访问了;因为目标对象是基类,根本就没有创建派生的成员变量,这时候访问,得到的就是一个未知的数;由此可见,把4字节的int类型转换为1字节的char、2字节的short类型时,从汇编的视角来看,其实只是在传递值的时候,更改了指针的类型来实现了强制转换;
2025-01-16 16:44:36
824
原创 C++ 多态 初学笔记
当基类构造函数中调用虚函数,此时由于派生类还没有构造,所以这个时候的虚函数还是静态绑定,调用的时基类的虚函数当派生类构造后,由于派生类中重写了虚函数,所以这个时候虚函数变成了动态绑定,调用的就是派生类重写的虚函数析构时,当派生类析构以后,派生类重写的虚函数也随之消失,再调用(在基类的析构函数中调用)虚函数时,调用的是基类的虚函数;(这里又变成了静态绑定)
2025-01-15 23:59:29
830
原创 C++ 指针数组、数组指针,指针常量、常量指针
指针常量,由于指针本身是个常量,所以无法更改,只能初始化的时候赋值;指针数组是一个数组,元素都是指针类型。数组指针是一个指针,一个指针,一个;
2025-01-15 14:47:32
175
原创 类 继承
当基类构造函数中调用虚函数,此时由于派生类还没有构造,所以这个时候的虚函数还是静态绑定,调用的时基类的虚函数当派生类构造后,由于派生类中重写了虚函数,所以这个时候虚函数变成了动态绑定,调用的就是派生类重写的虚函数析构时,当派生类析构以后,派生类重写的虚函数也随之消失,再调用(在基类的析构函数中调用)虚函数时,调用的是基类的虚函数;(这里又变成了静态绑定)
2025-01-14 18:58:12
713
原创 malloc 和 new 的区别
并且呢,这个malloc也是可以用来给类分配内存的,但是,仅可以说是这个例子是可以了,类的情况一但复杂,对于普通的数据类型来说free和delete没有什么区别,delete和delete[]没有什么区别。而delete[]不仅释放内存空间,而delete还会调用析构函数。delete仅仅是释放内存空间。malloc和new没有区别。还会调用每一个元素的析构函数。且调用第一个元素的析构函数。对于普通的数据类型来说。对于普通的数据类型来说。free仅是释放内存。
2025-01-13 21:43:41
335
原创 友元类 嵌套类
如果把 被嵌套类 的声明细节 写到外层类中,会显得臃肿;所以可以选择把 被嵌套类写到外面(要加作用域,也就是外层类的名称:: ),而外层类里面只写一个。
2025-01-13 21:20:57
373
原创 类 静态成员
*(3)类的静态成员函数不能是const;**已经有static了,再加const是没有必要的。(3)静态成员变量的作用域属于类,但静态成员变量的内存空间不属于类;C++17新语法允许在类的说明里面定义(要加inline关键字)int MyClass::a = 1;
2025-01-13 17:30:29
318
原创 联合编程(C语言和C++);编译器 ---入门
链接属性:内部链接属性:该名称仅仅在本转换单元中有效 const,static外部链接属性:该名称在其他的转换单元中也有效 extern,inline 无链接属性:该名称仅仅能够用于该名称的作用域内访问
2025-01-12 16:25:26
986
原创 C/C++进阶-函数
(2.2)还有const、static等关键字,直接让函数模板变得极其复杂。(2.3)并且,在函数的实现里,诸如运算、赋值等操作,面对传入进来的是指针、常量等情况,在使用时需要非常注意。
2025-01-08 14:40:55
1093
原创 Qt C++读取json文件
1.1 使用QFile打开文件1.2 使用QByteArray保存文件内容Q1.3 可以关闭文件了2.检查读取的这个文件是否符合json规范2.1 使用QJsonDocument类对内容进行一次转换:QByteArray —》 QJsonDocument,将转换中可能出现的异常抛给QJsonParseError;3.通过QJsonObject类、QJsonValue类、QJsonArray类,从“doc”中取获取我们想要的内容;这个obj对应在.json文件中的内容就是“{}”下的内容比如
2024-05-13 15:44:18
462
原创 IEC61850——智能电力系统通用标准
IEC61850:是一种电力系统自动化领域的国际标准,它定义了变电站设备之间的通信方式,以及相关的数据模型和接口。MMS:制造报文规范(Manufacturing Message Specification),是一种用于工业自动化系统通信的技术规范。CMS:内容管理系统(Content Management System),在电力行业中,特指国网新制定的国产61850 (CMS)协议。那么其实呢,IEC61850就是一个用在变电站及类似场景的协议。第一点。
2024-04-29 21:34:36
7764
1
原创 MODBUS
从响应:03 AA BB CC,前8位表长度(单位是八位,这里是03,就是说后面有3个八位),后面是数据值(不是地址),这里主收到从响应后,根据其询问的地址去改数据值------就是说这里问答必须是一一对应的。这个区域用于存储只读的数据,如传感器的温度数据等。这个区域存储的是可读可写的16位寄存器类型的数据,例如设置的密码等。事务处理标识箱* | 协议标识符* | 长度 | 单元标识符* | 功能码 | 数据 |主问询:00 00 00 0F,前16位是开始地址,后16位是连续问的长度。
2024-04-23 20:37:30
906
原创 TCP协议学习记录
一种编程抽象编写程序时,利用socket可以使用TCP;假设现在已经将TCP协议的规范用代码编写好了,只需要去使用它,就可以通过socket去使用;
2024-04-21 19:47:25
372
原创 Error:bool QCustomPlot::removeItem(QCPAbstractItem*) item not in list: 70055640
在QCustomPlot继承类的析构函数中removeItem掉QPointer< QCPItemTracer>、QPointer< QCPItemText> 等类。或者delete掉创建QPointer类的实例,当然创建了QPointer的类也要在析构函数中进行removeItem;使用Qt C++ /QCustomPlot,出现bool QCustomPlot::removeItem(QCPAbstractItem*) item not in list: 70055640的报错,
2024-03-30 23:34:01
434
原创 跟随鼠标动态显示线上点的值(基于Qt的开源绘图控件QCustomPlot进行二次开发)
XxwTracer用于在图表中显示鼠标所在位置的x,y值XxwTraceLine用于在图中显示水平或垂直的虚线头文件XxwTracer.h////// \brief The XxwTracer class:在图表中显示鼠标所在位置的x,y值的追踪显示器///Q_OBJECTpublic:XAxisTracer,//依附在x轴上显示x值YAxisTracer,//依附在y轴上显示y值DataTracer//在图中显示x,y值protected://是否可见//类型。
2023-12-15 18:19:39
882
原创 Qt Creator 11.0.3同时使用Qt6.5和Qt5.14.2
有时为了针对不同版本的源码或是需求,需要即使用Qt6.xx,又要用Qt6.xx。安装Qt时,一般会同时安装Qt Creator这款IDE作为开发平台。而安装不同的Qt版本时,配套会安装上不同版本的Qt Creator。**在同一台电脑上使用多个版本的Qt Creator可能会导致卡顿等问题,并且也不方便****于是,就需要在同一个Qt Creator上使用不同的Qt版本**
2023-12-02 17:48:19
4109
原创 nullptr和NULL的区别
1.表示空指针:当一个变量或对象被声明为指向某个类型的指针,但没有初始化为指向任何对象时,可以使用nullptr来表示这个空指针。2.表示不存在的元素:当访问数组或结构体中的不存在的元素时,可以使用nullptr来表示这个元素不存在。nullptr是一个空指针类型,而NULL是一个整数类型(通常为0)。在表示空指针或空对象时, 推荐使用nullptr。而NULL就当做0使用就好。
2023-11-12 00:54:46
456
原创 qt creator 11.02 debug symbols和qt creator 11 .0.2 plugin development各自的特点
Debug Symbols 是用于调试和故障排除的工具,它可以帮助定位代码中的错误和异常行为。Qt Creator 11.02 提供了更好的调试支持,包括 Debug Symbols 功能,以提供更好的调试体验和错误排查能力。Qt Creator 11.0.2 支持插件开发,使开发人员能够扩展 Qt Creator 的功能,满足特定需求,并提高开发效率。
2023-09-20 17:59:11
1079
原创 Qt 用什么类型的文件存放日志
SQLite数据库文件(SQLite Database File):与你提到的数据库相似,可以使用Qt提供的QtSql模块连接和操作SQLite数据库文件,将每条日志保存为数据库表中的一条记录,并可以使用SQL语句进行查询和管理。XML文件(XML File):将日志以XML格式保存在文件中,每条日志作为一个节点,可以使用Qt提供的QXmlStreamReader和QXmlStreamWriter等类进行解析和生成,方便进行查询和管理。CSV文件可以使用Qt的文件读写操作进行查询和管理。
2023-09-19 17:53:49
277
原创 centos7怎么解压zip文件(以及如何联网)
3.也可指定解压后文件放在哪儿:unzip xx.zip -d /xx/xx/xx。1.首先要切换到压缩包所在的文件目录:cd 后跟文件目录。2.使用unzip进行解压缩:unzip 后跟文件名。安装压缩和解压(zip and unzip)工具。注意点:NAT、DHCP。
2023-09-15 16:42:12
1231
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人