- 博客(15)
- 收藏
- 关注
原创 深入了解 epoll
在 Linux 中,epoll是用于处理高效 I/O 事件通知的机制。它主要用于监听多个文件描述符的状态变化,如网络连接、文件 I/O 操作等。相较于传统的select和poll,epoll提供了更好的性能,特别是在处理大量并发连接时,epoll的时间复杂度可以达到o(1),而select和poll的是o(n),因为select和poll要从用于监听的listenfd到的监听到的最大的描述符之间不断轮询,而epoll只轮询所有监听到事件的描述符。同时,epoll也解决了最大监听数的限制。
2025-01-01 23:27:36
1038
原创 使用Qt进行Http通信操作
在 Qt 中,实现 HTTP 通信主要依赖于 QNetworkAccessManager、QNetworkRequest 和 QNetworkReply 这几个类。以下是详细的介绍以及通过代码示例展示如何使用它们进行 GET 和 POST 请求。
2024-12-10 23:56:44
412
原创 http协议基础知识
HTTP是比TCP更高层次的应用层协议,根据规则,只有低层协议建立之后才能,才能进行更层协议的连接,因此,首先要建立TCP连接,一般TCP连接的端口号是80。实体消息是服务器向浏览器发送头信息后,它会发送一个空白行来表示头信息的发送到此为结束,接着,它就以Content-Type应答头信息所描述的格式发送用户所请求的实际数据。服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后边是MIME信息包括服务器信息、实体信息和可能的内容。
2024-12-10 18:45:01
1183
原创 使用Qt进行Json操作的方法
通过使用QJsonArray和QJsonValue,Qt 提供了一个强大且易用的接口来处理 JSON 数据。这些类使 JSON 的解析、生成和处理变得高效而简单,无需额外的库或复杂的手动解析逻辑。
2024-12-08 19:35:37
1246
原创 利用C++11新特性实现一个线程池
在上面代码中,使用emplace_back而不适用push_back是因为,使用emplace,线程数组会创建一个线程后直接调用其构造函数,而使用push_back则必须先创建一个临时的thread类型的变量,再将这个变量传参到线程数组中的线程中,再调用线程数组中创建的线程的拷贝构造函数,不如emplace方便快捷。1、线程数组 --- 用于存放工作线程 --- 在C++11中可以使用vector容器和线程类thread实现。要实现一个线程池,需要有以下几个关键组成部分。故可以创建成员变量如下。
2024-11-28 20:50:38
220
原创 Qt数据库操作教程及代码演示
/直接创建一个QSqlQuery类型的对象,不指定sql语句//创建一个QSqlQuery类型的对象,并指定sql语句。
2024-11-24 01:12:55
806
原创 QStackedWidget类的用法与代码案例
使用QListWidget和QStackedWidget实现一个动物百科全书。currentChanged信号用法。widgetRemoved信号用法。
2024-11-20 20:24:42
347
原创 Qt实现TCP通信
Qt要实现TCP通信需要两个类,第一个是服务器端,需要用到QTcpServer类,第二个是客户端,需要用到QTcpSocket类。另外,要想在Qt中进行网络通信,需要在pro文件中加入network模块。C语言建立Tcp通信时,需要经历“socket函数创建套接字-->bind绑定地址结构-->listen设置最大监听数-->accept监听来自客户端的连接”这几个阶段,QTcpServer中的listen函数就相当于C语言中bind和listen的功能。
2024-11-18 20:05:39
1305
原创 C++线程安全问题及其解决办法
这里我们发现,明明用了四个线程,每个线程会对a进行100000次的++操作,但是最终结果远不及预期中的400000,原因是其中一个线程在对a进行++操作时,还没有将++完后的值放回寄存器,其他线程就也去对a进行++,这时其他线程拿到的是++前的值,并对这个值++,这就导致了多次++的操作实际上只让a的值增加了1。解决方法一:访问公共资源时使用mutex互斥量进行进行加锁。可以看到运行结果如下,a的值被进行了正确的++操作。废话不多说直接上代码。解决方法二:原子变量。
2024-10-18 23:03:44
330
原创 C++实现搜索二叉树(Binary Search Tree)
对只有一个key的二叉搜索树稍加改造,这样一个key,value模型就完成了,这种KV模型存在的意义便是,可以通过找到key所在的位置从而找到该位置的val,这个模型的运用场景有很多,以下有一段示例代码。另外还可以利用KV模型进行计数操作,记录key出现的次数,示例代码如下所示。以上便是关于搜素二叉树的实现和运用,希望能够班帮助到大家。
2024-03-19 07:30:07
445
1
原创 C++模板(template)详解
原因是在链接过程中,编译器找不到模板函数的定义,因为在使用模板时,.h文件中的模板的声明知晓了模板参数的类型,但在.cpp文件中的模版不知道,所以.cpp中模板的定义没法实例化,也就没法在编译阶段生成一份经过实例化的具体的代码,这将导致程序在链接阶段找不到模板函数的实现而报链接错误。这样一来,在调用Add函数的时候,其本质上是调用了上面的经过实例化的模板函数,这样做的好处就是,程序员就可以不用对每一种数据类型都去实现对应的函数,大大提高了效率,而且只实现这么一份通用的模板函数可以使其更易于维护。
2024-03-09 16:45:47
10464
3
原创 C++内存管理相关知识
那么,为什么有了malloc和free等函数后,C++还要搞出个new和delete呢,关键就在于,对于自定义类型,在使用new申请空间后,编译器会自动调用该类型的构造函数,对申请的空间进行初始化,同样,对于自定义类型,在使用delete释放空间时,编译器会首先调用自定义类型的析构函数,再对空间进行释放。堆区:用于动态内存分配,malloc等内存申请函数申请的就是堆区的内存,堆区是一个大容器,具有较大空间,在32位环境下最多可有2G空间,而在64位环境下可以认为是拥有无限内存可供分配。
2024-02-05 00:43:13
413
1
原创 C++初始化列表的优点
这其中,private 下面的代码只是声明对象的参数的存在,参数的实际定义其实是在函数的初始化过程中实现的。对于赋值初始化,其过程可以分为两步:第一步,而对于没有默认构造函数的自定义类型而言,显而易见,由于没有默认的构造函数,其无法完成第一步的定义操作,故也不能使用对象体内的赋值初始化。初始化列表的优点便是,可以直接在定义的过程中就把值给参数,这也让它可以胜任为引用等类型的初始化操作,这就类似于。这里还要注意的是,初始化列表对参数初始化的顺序,只与声明的顺序有关,与列表中参数所处位置的前后并无关系。
2024-01-30 22:51:04
410
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人