自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Qt--绘图API

虽然 Qt 已经内置了很多的控件, 但是不能保证现有控件就可以应对所有场景.很多时候我们需要更强的 "自定制" 能力.Qt 提供了画图相关的 API, 可以允许我们在窗口上绘制任意的图形形状, 来完成更复杂的界面设计."控件" , 本质上也是通过画图的方式画上去的.画图 API 和 控件 之间的关系, 可以类比成机器指令和高级语言之间的关系.控件是对画图 API 的进一步封装;画图 API 是控件的底层实现.

2026-08-06 10:57:15 209 1

原创 Qt--界面优化

有些控件内部包含了多个 "子控件" . 比如 QComboBox 的下拉后的面板, 比如 QSpinBox 的上下按钮等.可以通过子控件选择器 :: , 针对上述子控件进行样式设置.但是上个方案不好用,太麻烦了,仅供参考,Qt中有更好的方案,Qt Designer中直接集成这样的功能,允许我们把样式直接写到.ui文件里。伪类选择器, 是根据控件所处的某个状态被选择的. 例如按钮被按下, 输入框获取到焦点, 鼠标移动到某个控件上等.如果设置了全局样式,在某个控件里设置的样式和全局样式冲突了,会怎么样?

2026-08-05 17:38:28 311 1

原创 Qt--网络编程

和多线程类似, Qt 为了⽀持跨平台, 对网络编程的 API 也进行了重新封装.在进行网络编程之前, 需要在项目中的 .pro 文件中添加 network 模块.添加之后要手动编译⼀下项目, 使 Qt Creator 能够加载对应模块的头文件.

2026-08-04 09:53:38 266

原创 Qt-- 系统相关

事件是应用程序内部或者外部产生的事情或者动作的统称。在 Qt 中使用一个对象来表示一个事件。所有的 Qt 事件均继承于抽象类 QEvent。事件是由系统或者 Qt 平台本身在不同的时刻发出的。当用户按下鼠标、敲下键盘,或者是窗口需要重新绘制的时候,都会发出一个相应的事件。一些事件是在用户操作时发出,如键盘事件、鼠标事件等,另一些事件则是由系统本身自动发出,如定时器事件。事件名称描述鼠标事件鼠标左键、鼠标右键、鼠标滚轮,鼠标的移动,鼠标按键的按下和松开键盘事件按键类型、按键按下、按键松开。

2026-08-03 14:33:42 240 1

原创 Qt--窗口

widget更像是一个窗口里的内容,而实际开发中往往又多个窗口,,通过组合形成一个完整的程序1.菜单栏(QMenuBar)=>菜单(QMenu)=>菜单项(QAxtion)2.工具栏(QToolBar)(可具有多个)=> 菜单项(QAction)3.子窗口(QDockWidget)=> QWidget => 放置其他控件4.状态栏(QStatusBar)=> QWidget。

2026-07-31 23:27:02 293

原创 QT——多元素控件

以 QTableWidget 和 QTableView 为例.

2026-07-29 17:23:06 274

原创 QT常用控件

QTextEdit 表示多行输入框. 也是一个富文本 & markdown 编辑器.并且能在内容超出编辑框范围时自动提供滚动条.垂直方向滚动条的出现策略。

2026-07-28 15:29:51 164 1

原创 Qt常用控件

使用 QPushButton 表示一个按钮. 这也是当前我们最熟悉的一个控件了.QPushButton 继承自 QAbstractButton . 这个类是一个抽象类. 是其他按钮的父类.在 Qt Designer 中也能够看到这里的继承关系.QAbstractButton 中, 和 QPushButton 相关性较大的属性按钮快捷键默认是连发的,但是鼠标点击按钮就不行,通过setAutoRepeat来设置注意:参数是QKeySequence对象,表示一组快捷键。

2026-07-26 15:39:39 348 1

原创 QT--QWidget常用控件

Qt允许我们通过自定义的图片来设置光标,先准备一个图片,然后将该图片导入到项目中,qrc管理,然后在代码中访问到这个图片,基于这个图片构造出光标对象并设置QPixmap通过这个对象表示一个图片//访问到图片文件//缩放图片//构造光标对象//默认点击的位置是光标的左上角,所以热点扩大范围,以图片左上角(0,0)为原点,偏移(10,10)作为点击位置//设置光标delete ui;小图标的下载推荐去阿里巴巴矢量图标库去找,免费的。

2026-07-22 17:16:44 317

原创 QT_信号和槽

自定义槽函数非常关键,开发中大部分情况需要自定义槽函数,槽函数,就是用户触发某个操作后要进行的业务逻辑手动代码创建,就是定义一个普通的成员函数,在Widget里面创建button->setText("按钮");delete ui;//按下按钮就修改窗口的标题this->setWindowTitle("按钮已经按下!");在以前版本得用slots如这样public slots : xxxx 元编程,qmake构建qt项目的时候就是调用扫描器,扫描关键字,基于关键字再生成代码第二种图形化生成。

2026-07-20 16:29:40 237

原创 初识QT——对象树

直接在构造函数里面用QLabel组件效果问题: QLabel * label = new QLabel(this);定义完new了之后不释放不会内存泄漏吗?答:不会。该指针对象通过this被挂载到对象树上,生命周期交给Qt的对象树来统一管理,程序结束统一释放,前端开发也有类似的对象书,本质是一个树形结构,通过树形结构把界面上的各种元素组织起来。如果不用指针的话,程序结束析构函数会直接释放掉,连效果都没有继承一个QLabel,然后实例化,看看关掉程序后会不会调用析构释放该指针。

2026-07-17 16:38:26 335

原创 基于websocket的多用户五子棋网页游戏

WebSocket 是从 HTML5 开始支持的一种网页端和服务端保持长连接的 消息推送机制。传统的 web 程序都是属于 "一问一答" 的形式,即客户端给服务器发送了⼀个 HTTP 请求,服务器给客户端返回一个 HTTP 响应。这种情况下服务器是属于被动的一方,如果客户端不主动发起请求服务器就无法主动给客户端响应。

2026-07-15 15:26:36 565

原创 Reactor 反应堆模式

代码整体围绕 “Reactor 模式” 实现一个网络服务器(以计算器为例),各模块按职责可分为四类,具体作用如下:Listener实例化 → 创建TcpSocket(监听套接字) → 注册到Reactor的Epoller(监控新连接) → (新连接到来时) 创建Channel实例(封装客户端连接) → 注册到Reactor的Epoller(监控客户端I/O) → (客户端发数据) Reactor分发事件到Channel → Channel读取/处理/响应数据负责监听和接受新连接,Channel。

2025-08-23 22:30:42 806 8

原创 多路转接 epoll

当调用 epoll_wait 检查是否有事件发生时,只需要检查 eventpoll 对象中的rdlist 双链表中是否有 epitem 元素即可.如果 rdlist 不为空,则把发生的事件复制到用户态,同时将事件数量返回给用户. 这个操作的时间复杂度是 O(1).epoll 默认状态下就是 LT 工作模式.当 epoll 检测到 socket 上事件就绪的时候, 可以不立刻进行处理. 或者只处理一部分.如上面的例子, 由于只读了 1K 数据, 缓冲区中还剩 1K 数据, 在第二次调用。

2025-08-16 00:23:46 811 7

原创 poll 代码改写select

在 Linux 系统中,poll 是一个系统调用(system call),用于,允许程序同时监控多个文件描述符(file descriptor)的状态变化(如是否可读、可写或发生错误),从而高效地处理多个 I/O 操作。与select 相比,poll 解决了一些限制(如文件描述符数量上限),是更灵活的 I/O 多路复用方案。

2025-08-14 19:53:09 983 5

原创 多路转接 select

select可以一次性等待多个fd,一旦有其中任意一个就绪就会通知上层,告诉调用方,哪些fd已经可以IO了,

2025-08-11 21:46:55 1031 20

原创 五种 IO 模型与阻塞 IO

我们在读数据的时候client向server要数据的时候是要等对方发过自己的接受缓冲区才有数据,IO了不一定有数据,也有可能在网络里跑要等,还有我们调用read等系统调用向内存要数据,其实是假借操作系统之手,创建子进程,继承文件描述符表,继承pcb其他数据,通过文件描述符找到数据在拷贝回来,这也要时间,所以IO的时候,我们可以认为。

2025-08-10 15:31:29 1191 27

原创 NAT、代理服务、内网穿透

数据链路层的作用: 两个设备(同一种数据链路节点)之间进行传递数据以太网是一种技术标准;既包含了数据链路层的内容, 也包含了一些物理层的内容. 例如: 规定了网络拓扑结构, 访问控制方式, 传输速率等;以太网帧格式理解 mac 地址理解 arp 协议理解 MTU。

2025-08-09 16:14:14 753 5

原创 数据链路层

ARP 协议建立了主机 IP 地址 和 MAC 地址 的映射关系.在网络通讯时,源主机的应用程序知道目的主机的 IP 地址和端口号,却不知道目的主机的硬件地址,数据包首先是被网卡接收到再去处理上层协议的,如果接收到的数据包的硬件地址与本机不符,则直接丢弃,因此在通讯前必须获得目的主机的硬件地址,arp就是用来将ip地址转化为mac地址。注意到源 MAC 地址、目的 MAC 地址在以太网首部和 ARP 请求中各出现一次,对于链路层为以太网的情况是多余的,但如果链路层是其它类型的网络则有可能是必要的。

2025-08-03 16:51:43 1310 9

原创 网络层概述

应用层是用户去处理的,数据传输过来干嘛用的由我们自己去实现,传输层是TCP,UDP协议,用来保证可靠性,是面向数据包还是面向字节流,就好比空运还是车运,各有各的好处,场景不一样,网络层是IP协议,路由器选择路径用来保证数据从这个主机发给那个主机的,数据链路层是保证在子网内通信用ARP协议替换ip给mac实现报文递交,在我们看来路由器交给路由器其实就是局域网给局域网,只不过一个路由器有两个ip而已。

2025-07-31 15:01:59 1164 10

原创 传输层协议 TCP

TCP 全称为 "传输控制协议(Transmission Control Protocol"). 人如其名, 要对数据的传输进行一个详细的控制。

2025-07-20 21:01:31 1369 5

原创 传输层协议 UDP

我们注意到, UDP 协议首部中有一个 16 位的最大长度. 也就是说一个 UDP 能传输的数据最大长度是 64K(包含 UDP 首部).然而 64K 在当今的互联网环境下, 是一个非常小的数字.如果我们需要传输的数据超过 64K, 就需要在应用层手动的分包, 多次发送, 并在接收端手动拼装;在 TCP/IP 协议中, 用 "源 IP", "源端口号", "目的 IP", "目的端口号", "协议号" 这样一个五元组来标识一个通信(可以通过 netstat -n 查看)UDP 传输的过程类似于寄信.

2025-07-17 14:58:38 956 4

原创 应用层协议 HTTP

虽然我们说, 应用层协议是我们程序猿自己定的. 但实际上, 已经有大佬们定义了一些现成的, 又非常好用的应用层协议, 供我们直接参考使用. HTTP(超文本传输协议)就是其中之一。在互联网世界中,HTTP(HyperText Transfer Protocol,超文本传输协议)是一个至关重要的协议。它定义了客户端(如浏览器)与服务器之间如何通信,以交换或传输超文本(如 HTML 文档)。HTTP 协议是客户端与服务器之间通信的基础。

2025-07-10 23:45:28 1324 6

原创 如何将服务守护进程化

刚刚我们谈到了进程组的概念, 那么会话又是什么呢?会话其实和进程组息息相关,会话可以看成是一个或多个进程组的集合, 一个会话可以包含多个进程组。每一个会话也有一个会话 ID(SID)通常我们都是使用管道将几个进程编成一个进程组。如上图的进程组 2 和进程组 3 可Shell# &表示将进程组放在后台执行# 用管道和 sleep 组成一个进程组放在后台运行# 查看 ps 命令打出来的列描述信息# 过滤 sleep 相关的进程信息。

2025-07-07 14:42:51 785 24

原创 应用层自定义协议与序列化

我们程序员写的一个个解决我们实际问题, 满足我们日常需求的网络程序, 都是在应用层.

2025-06-30 19:05:10 1153 13

原创 Socket 编程 TCP

和刚才 UDP 类似. 实现一个简单的英译汉的功能。

2025-06-26 21:47:26 1220 12

原创 Socket 编程 UDP

简单的回显服务器和客户端代码,本地回环,要求c,s砸啊哎同一台机器,本地通信,client发送的数据不会被推送到网络,而是在OS内部绕一圈交给对应的服务器,一般用于网络代码的测试。1.bind公网IP --不行 公网IP没有配置在机器里公网IP无法直接bind,云服务器是内部处理过的。如果我们显示的进行绑定,client未来访问的时候,就必须使用server端bind的地址,否则找不到。服务器手动分配为零,允许接受任何报文,自动分配任意IP地址,否则指定IP只能对应的IP+地址才能访问,

2025-06-17 17:41:53 548 5

原创 Linux网络基础概念

首先回答,两台主机在同一个局域网,是否能够直接通信?是的,每台主机在局域网上,要有唯一的标识来保证主机的唯一性:mac 地址。

2025-06-16 17:17:22 1173 2

原创 线程池封装

一种线程使用模式。线程过多会带来调度开销,进而影响缓存局部性和整体性能。而线程池维护着多个线程,等待着监督管理者分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价。线程池不仅能够保证内核的充分利用,还能防止过分调度。可用线程数量应该取决于可用的并发处理器、处理器内核、内存、网络sockets等的数量。需要大量的线程来完成任务,且完成任务的时间比较短。比如WEB服务器完成网页请求这样的任务,使用线程池技术是非常合适的。

2025-06-07 22:21:24 910 24

原创 网络基础概念

截止到目前,我们还没接触过任何协议,但是如何朴素的理解协议,我们已经可以试试了。OS 源代码一般都是用 C/C++语言写的。下面,仔细看看下面的图:

2025-06-05 20:41:10 1064 24

原创 日志与策略模式

IT行业这么火, 涌入的人很多. 俗话说林子大了啥鸟都有. 大佬和菜鸡们两极分化的越来越严重. 为了让菜鸡们不太拖大佬的后腿, 于是大佬们针对一些经典的常见的场景, 给定了一些对应的解决方案, 这个就是 设计模式。

2025-06-01 21:12:12 998 8

原创 POSIX信号量

POSIX信号量和SystemV信号量作用相同,都是用于同步操作,达到无冲突的访问共享资源目的。本质就是一个计数器,是对特定资源的预定机制,本身相比于基本类型,POSIX信号是原子的,POSIX可以用于线程间同步,信号量把对临界资源是否存在,就绪等的条件,以原子性的形式呈现在临界资源前就判断了。

2025-05-30 20:25:56 943 3

原创 Linux线程同步

生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列里取,阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力。当队列满时,往队列里存放元素的操作也会被阻塞,直到有元素被从队列中取出(以上的操作都是基于不同的线程来说的,线程在对阻塞队列进程操作时会被阻塞)条件等待是线程间同步的一种手段,如果只有一个线程,条件不满足,一直等下去都不会满足,:因为时序问题,而导致程序异常,我们称之为竞态条件。

2025-05-25 19:32:49 823 33

原创 线程封装与互斥

在多线程编程中其他的线程都执行move,寄存器和mutex内都是0,交换完还是0,全部进了下一个调度队列,直到拥有锁的线程执行完释放锁,把1写回mutex,才能轮到下一个线程申请锁成功,如果没有申请成功,锁被占用了,执行else挂起等待,等拥有锁的释放锁后,才可以执行后面的代码申请锁区访问临界支援,说白了,谁交换走了1,谁就持有锁,谁就有优先访问临界资源的权力。但有时候,很多变量都需要在线程间共享,这样的变量称为共享变量,可以通过数据的共享,完成线程之间的交互。上述代码用多线程模拟抢票,但是为什么抢到负数?

2025-05-23 19:38:13 1544 21

原创 Linux线程控制

所以,我在自己的代码里面调用pthread_create,是在动态库内部帮我们创建动态库描述的控制块,管理块的开头叫TCB,里面包含了描述线程的相关信息,而TCB里包含了void *ret字段,而当前线程运行结束的时候,会把自己的退出状态写到自己的控制块ret里,然后主线程又和新线程共享地址空间,主线程也就能通过起始地址+偏移量找到对应线程的控制块,主线程通过pthread_join拿到对应的退出状态拷贝回来,进程结束LWP自动释放,但是库里的东西没被释放,LWP查不到内存泄漏。怎么理解这个“ID”呢?

2025-05-15 15:46:41 1429 20

原创 线程概念与控制

在一个程序里的一个执行路线就叫做线程(thread)。更准确的定义是:线程是“一个进程内部的控制序列”,一切进程至少都有一个执行线程,线程在进程内部运行,本质是在进程地址空间内运行 在Linux系统中,在CPU眼中,看到的PCB都要比传统的进程更加轻量化,透过进程虚拟地址空间,可以看到进程的大部分资源,将进程资源合理分配给每个执行流,就形成了线程执行流以前我们说的进程其实是只有一个线程的进程,叫轻量级进程PCB,每个进程有独立的页表,独立的虚拟内存,有自己的struct等数据结构。

2025-05-04 17:29:54 748 27

原创 Linux进程信号

访问零号地址,操作系统拿到的是虚拟地址,cr3寄存器可通过页表的地址找到页表,MMU将cr3的页表地址和要访问的0号地址做虚拟的页表转化,但是页表下在零号地址没有对应的映射关系,转化失败,硬件报错,cpu的寄存器无法把100写到0号地址处,发送11号信号,终止进程。上面的所有内容,我们都没有做非常多的解释,主要是先用起来,然后渗透部分概念和共识,下面我们从理论和实操两个层面,来进⾏对信号的详细学习、论证和理解。发送固定的6号(SIGABRT)信号给自己,要求进程必须处理,目的就是终止进程。

2025-04-04 21:13:08 1596 51

原创 进程间通信--匿名管道

管道是Unix中最古老的进程间通信的形式。

2025-03-15 21:14:39 926 32

原创 库制作与原理

库是写好的现有的,成熟的,可以复用的代码。细节:动静态库g++/gcc默认使用动态库,非静态链接只能-static,一旦-static,就必须得存在对应的静态库,只存在静态库,可执行程序对于该库,只能静态链接了。头文件包含了方法的声明,库包含了方法的实现,所以,对库的安装,其实就是将对应的头文件,库文件拷贝到系统的指定文件下,将来编译时只要指定库名称,gcc自动找头文件和库文件。在Linux系统下,默认安装大部分库,默认优先安装动态库,库:应用程序=1:n,vs不仅可以形成可执行程序,也能形成动静态库。

2025-03-07 20:50:13 1336 41

原创 Linux文件系统

机械磁盘是计算机中唯一的一个机械设备磁盘--- 外设,慢,容量大,价格便宜磁盘的存储结构扇区:是磁盘存储数据的基本单位,512字节,块设备如何定位一个扇区呢?柱面(cylinder),磁头(head),扇区(sector),显然可以定位数据了,这就是数据定位(寻址)方式之一,CHS寻址方式。

2025-02-22 18:05:11 1505 36

空空如也

空空如也

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

TA关注的人

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