自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【Mysql:内置函数】

将str中用str1替换字符串str中的str2。从str中的左边去size个字符。

2025-03-28 10:16:55 200

原创 【QT:QSS】

Qt仿照CSS的模式,引⼊了QSS,来对Qt中的控件做出样式上的设定,从⽽允许程序猿写出界⾯更好看的代码。由于Qt本⾝的设计理念和⽹⻚前端还是存在⼀定差异的,因此QSS中只能⽀持部分CSS属性。整体来说QSS要⽐CSS更简单⼀些注:如果通过QSS设置的样式和通过C++代码设置的样式冲突,但QSS优先级更⾼。

2025-03-19 09:36:20 710

原创 【QT:网络编程】

网络编程的本质就是在编写应用层代码。需要传输层支持。而传输层的协议有UDP、TCP等使用QT网络编程的API,需要在.pro文件中添加network模块,而QT中的控件和其他内容都是包含在QtCore模块中的(默认添加)QT为什么要划分模块?Qt是一个庞大的框架,当功能集中放在一块时,如果书写一个简单的程序,没有进行模块划分,那么此时生成的可执行程序就会很大,而其中包含了很多没有使用的功能,性价比太低,不如做模块化处理,按需引入所需要的模块。

2025-03-18 19:05:18 864

原创 【QT:多线程、锁】

在Linux中的API是Linux提供的pthread库。而QT针对系统提供的线程API重新封装了。QT创建线程的方法:线程的入口函数创建一个新线程,在新线程中进行计时,代码示例:QThread的应用场景:客户端与服务器进行频繁的交互时,程序会被系统阻塞挂起,而一旦程序被阻塞,那么用户的各种操作都无法响应,所以解决这种密集的I/O操作时,使用线程是最好的方法,就算线程被阻塞,但是不会影响主线程对用户操作的响应,主线程就负责事件的循环和处理用户操作。

2025-03-18 12:55:42 367

原创 【QT:文件操作】

QFile中提供了打开,读写,关闭的操作。关闭的本质上是释放文件描述符中的表项,文件描述符存在上限,如果一直打开不关闭的话,就可能会使文件描述符表占满。场景如下:写入大量数据时,写入新数据会将旧的文件清空再写入,但如果中途新的数据写到一半,结果出错了,新的数据用不了,旧的数据也丢失了。QIODevice是Qt中所有输入输出设备的基础类,i/o设备就是能够进行数据输入输出的设备。QTemporaryFile是一个临时文件操作的类,这个对象销毁,对应的文件也会销毁,这个类一般与QSaveFile搭配使用。

2025-03-18 10:24:08 289

原创 【QT:QT事件】

此外,鼠标移动不同于鼠标按下,鼠标移动当鼠标随便移动就可以产生大量事件,当进行事件捕获时进行一些复杂的逻辑时,程序的负担就会很重容易产生卡顿,因为Qt为了保证鼠标的流畅,默认情况下不会对鼠标位置进行追踪,追踪鼠标位置需要手动调用(方法为:setMouseTacking)用户进行的各种操作会产生事件,程序员给事件关联上处理函数,当事件触发时就能够执行到对应的代码。事件本身是操作系统提供的机制,QT把这种机制进行了封装,但对于事件对应的代码书写并不方便,于是Qt对事件机制进行了进一步的封装,这就是信号槽。

2025-03-18 08:27:06 888

原创 【QT:窗口】

在上一篇中的代码都是基于QWidget控件的,而QWidget更多的是作为别的窗口的一部分,QMainWindow是窗口的一个整体部分,以下是它的组成成分自定义对话框需要继承QDailog创建类新建项目,选中QT,再选择QT设计师界面类此时拥有两个ui界面拖拽控件,设定槽函数将这俩界面关联起来菜单栏:菜单栏中包含菜单,菜单中有菜单项,菜单在窗口中是唯一的工具栏:在窗口中工具栏可以有多个子窗口:放置其他的控件状态栏:在程序下面显示状态。

2025-03-17 18:22:14 661

原创 【QT:控件】

每个控件都是可扩展的,且每个控件都对应这Qt内置的一个类,可以基于这个类,继承出自定义的类,在自定义的子类中,也可以添加更多的属性和方法。

2025-03-16 16:19:18 1101

原创 【QT:信号和槽】

使用控件,右击鼠标,转到槽,然后选择信号这里没有使用connect函数,也能让标题发生变化,是因为在QT中除了connect函数连接信号槽之外,还可以通过函数名自动连接。开发中大部分情况需要自定义槽函数,槽函数是用户触发某个操作要进行的业务逻辑。信号对应的是用户的某个操作,在 GUI中,用户操作可以穷举。而自定义信号,程序员只需要写出函数的声明并告知QT这是一个信号,而该信号的定义则是QT在编译过程中自动生成的。作为信号函数,函数的返回值必须是void,有无参数都可以,支持函数重载。QT中。

2025-03-14 12:34:12 395

原创 【Mysql:数据库的基础操作】

备份的数据库不仅备份了数据内容,还把sql的命令也备份了。创建数据库的本质在数据库安装的路径下创建目录。删除某一列,被删除的列数据会全部丢失。而删除数据库的本质其实就是删除目录。

2025-02-19 20:31:37 330

原创 【Linux:序列化和反序列化】

消息由几部分构成,什么含义由上层软件解释,网络通信的过程可以不关心发送的数据内容,只需要知道是字节流即可。序列化将数据内容由多变一,方便网络发送,反序列化将消息由一变多,方便上层处理。

2025-01-24 18:33:58 402

原创 【C++多线程编程:六种锁】

C++标准库提供了timed_mutex来实现该功能,支持超时机制,当线程尝试获取锁时,可以指定一个超时时间,如果在该时间内无法获取锁,线程将返回并继续执行其他任务。通过使用超时互斥锁,可以有效的避免线程在等待锁时无限地阻塞,提高程序地响应和稳定性。在C++中,轻量级锁通常指的是一些开销较小,性能较高的锁机制,C++并没有直接提供“轻量级锁”的概念,可以通过一个自旋锁来达到实现轻量级锁的目的。自旋锁:一种简单的锁机制,当线程尝试获取锁时,如果锁已被其他线程占用,则当前线程会不断地循环等待,直到锁可用。

2025-01-09 16:04:42 1065

原创 【Linux:网络字节序+大小端转换函数】

计算机中存在两种存储字节的方式,分别是:大端存储和小端存储,TCP/IP协议规定,网络数据字节流应采用大端字节序。如果当前发送的主机是小端机就需要将数据转化为大端,再发送。不可以,当报文发送时,对端主机解析报文解析报文是大端解析还是小端解析呢,可以理解该问题为一个“蛋生鸡还是鸡生蛋”的问题。因此,网络协议(TCP/IP)直接规定网络通信必须大端字节序(低地址高字节),由此就需要有大小端转换的函数了。发送主机通常将发送缓冲区中的数据按内存地址从低到高的顺序发出。

2024-12-05 19:30:36 453

原创 【Linux:端口号+socket介绍】

domainAF_INET: 使用IPv4格式的ip地址AF_INET6: 使用IPv6格式的ip地址typeSOCK_STREAM: 使用流式的传输协议SOCK_DGRAM: 使用报式(报文)的传输协议protocolprotocol:一般写0,使用默认协议SOCK_STREAM: 流式传输默认使用的是tcpSOCK_DGRAM: 报式传输默认使用的udp返回值调用成功,返回文件描述符,调用失败,返回-1该函数的返回值是一个文件描述符,通过该文件描述符,可以操作内核中的某一块内存。

2024-12-05 18:54:07 666

原创 【Linux:epoll】

event是一个结构体,有两个成员:events和data。

2024-11-16 11:31:21 651

原创 【Linux:IO多路复用(select、poll函数)

nfds:是在这三个文件描述符集合中找出一个最大的文件描述符再+1内核中需要线性遍历这些集合中的文件描述符,该值是循环结束的条件该参数在windows中无效,指定为-1即可readfds:读集合一般都是需要进行检测的,这样才能知道哪些文件描述符可以接收数据writefds:内核只检测这个集合中的文件描述符对应的写缓冲区,如果不使用该参数可以用NULL指定exceptfds:内核只检测这个集合中的文件描述符是否有异常状态,如果不使用该参数可以用NULL指定。

2024-11-12 20:16:02 1946

原创 【Linux:HTTP协议】

服务器给客户端回复数据叫做HTTP响应,http协议封装好数据之后是一个数据块,得到若干行数据,使用的换行符为:\r\n,通过这个换行符即可判断这行是否结束。(这也解释了我们使用手机,平板等不同的客户端的浏览器访问网页时,返回给我们的是同样的数据,这是因为使用的是同一种协议)状态代码有三位数字组成,第一个数字定义了响应的类别,共分。http协议分为两部分:http请求和响应。所请求的资源是在哪个主机的哪个端口上。声明用户的操作系统和浏览器版本信息。当前页面是从哪个页面跳转过来的。协议是一种数据格式的约定。

2024-11-10 13:34:41 583

原创 【Linux:tcp三次握手和四次挥手】

TCP报文中含有SYN、ACK、FIN等标识,把这些标识设置1就是开启这些标识,设置为0就是关掉这些标识。

2024-11-07 16:03:02 518

原创 【Linux:TCP通信流程】

IP+端口号就叫socket,IP是每一台主机唯一的标识符,而端口号在同一台主机上也是唯一的。网络通信的本质其实就是进程间通信问题:每一个进程都有自己的pid,而且pid都是唯一的,为什么还需要额外用端口号来找到进程呢?进程中有需要网络通信的进程也有不需要网络通信的进程,如果拿pid通信,就区分不了哪些进程是不需要通信的,有端口号的进程可以进行网络通信,没有端口号的就不需要网络通信,通过有无端口号对进程是否需要通信做区分。

2024-10-31 21:09:46 1477

原创 【Linux:网络基础】

协议实际上可以称为一种“约定”,通过网络通信中的数据约定,不同主机必须遵循相同的网络协议才可以实现通信。协议即为通信双方都认识的结构化的数据类型。

2024-10-29 10:49:09 559

原创 【C++:智能指针】

内存泄漏是指因为疏忽或者错误造成程序对一部分不再使用的内存没有进行释放的情况,内存释放不是指内存在物理上的消失,而是应用程序分配某段内存时,因设计错误,失去了对该内存的控制,从而造成内存浪费。

2024-10-25 20:08:52 428

原创 【Linux:生产消费模型】

总结:伪唤醒就是添加未被满足,但线程被异常唤醒叫做伪唤醒。情况:一个生产者只生产唯一的产品,但消费者有两位。锁和条件变量即可实现以上三种关系。

2024-10-19 14:30:20 957

原创 【Linux:线程锁】

举个例子,有两个线程,命名为A,B,内存中的临界资源加锁后,lock加锁后为0,未加锁即为1,寄存器中的数据设为0。因此,把数据从内存移动到cpu寄存器中,本质就是把数据从共享变成线程私有。

2024-10-10 17:36:34 447

原创 【Linux:线程控制】

主线程需要等待其他线程结束后再退出,避免僵尸进程等情况的出现,线程运行的顺序并不确定,是随机切换的。

2024-10-05 17:46:32 449

原创 【Linux:线程概念】

在CPU中存在一个cache,用于存放热数据,在进程切换时,不仅要切换地址空间,页表,上一个进程cache的热数据也要做清空然后重新加载该进程的热数据。但线程是共享地址空间,CPU 中cache的数据每个线程都有可能用上,就不需要清空cache中的数据重新加载。栈 (线程在运行时会形成各种临时变量,这些临时变量会被每个线程保存在自己的栈区)pid和lwp一样的线程叫做主线程。上图可以看见创建了两个线程,但是俩线程的pid却是一样的。热数据: 高频访问的数据、极其重要的文件。一组寄存器(硬件的上下文数据)

2024-09-30 18:08:41 626

原创 【Linux:页表转换】

操作系统管理内存并不是以字节位单位,而是以4内存块为单位进行管理的,一个内存块大小为4kb。

2024-09-30 10:32:08 258

原创 【Linux:进程信号】

信号的产生是异步的(信号在产生时,进程是不受干扰的,两者独立进行,当信号发送给进程时进程才会识别处理)原因:1.全局变量不能被所有的进程都看见 2.信号量的++或者--不是原子的(原子就是没有中间过程,只有开始和结束)信号的发送与保存本质是修改指定进程PCB的指定位图,PCB是内核数据结构对象,只有OS有资格对其进行修改。信号是Linux系统提供的一种对指定进程发送特定事件的一种方式。【1,31】信号是不可靠的,信号有可能会丢失。【34,64】信号是可靠的,信号不会丢失。

2024-09-25 17:40:00 801 1

原创 【Linux:共享内存】

共享内存不随着进程的结束就释放,因为共享内存不属于进程而属于操作系统,需要手动释放或者后续其它系统调用。共享内存的生命周期随内核。

2024-09-19 20:32:19 897

原创 【Linux:命名管道】

当读端关闭时,写端也会退出。

2024-09-17 15:29:58 360

原创 【Linux:动静态库】

库文件实际就是把.o文件打包,库文件的出现提高了i开发的效率。

2024-09-13 14:10:27 410

原创 【Linux:文件系统】

在操作系统中,为了实现内核对磁盘的管理,对磁盘进行一个逻辑抽象的管理。把磁盘抽象的看作为一个数组。该数组叫做sector disk_arry[N]数组,文件=很多个secotr数组下标,操作系统可以通过扇区的下标转化为CHS地址,从而定位到指定的扇区操作系统与磁盘进行交互时(为了拷贝更多的数据),一次性读取磁盘的基本单位:4Kb 8*扇区理解为八个连续的扇区,在系统层次上叫做数据块。

2024-09-10 12:26:52 865

原创 【Linux:软硬链接】

软链接与硬链接是文件系统中的两种不同的链接方式。

2024-09-08 17:26:19 630

原创 【Linux:管道】

每一个进程想要访问物理内存,都是通过访问进程虚拟地址空间当中的虚拟地址进行访问,访问时,通过各自的页表结构,造成了每一个进程和每一个进程的数据独立,由于进程独立性的存在,进程运行时不会相互干扰,但是造成了进程与进程之间相互协作的难点。由此学习进程间通信本质就是为了进程与进程交换数据时使用进程通信的前提是不同的进程能看见同一份资源。

2024-08-25 12:15:30 419

原创 【Linux:进程终止】

退出码是子进程退出时,返回给父进程的一个回应每一个退出码都对应着不同的退出原因,父进程bash获取到最近的一个子进程的退出码。子进程执行完毕后,调用exit()/_exit()函数并传递一个整数值作为退出码操作系统记录子进程的退出码,并将其状态设置为终止。

2024-08-13 14:51:39 347

原创 【Linux:地址空间】

实际的物理内存中,一个地址不可能会存在两个不一样的内容,因此这里的地址只能是虚拟地址。

2024-08-11 11:22:49 273

原创 【Linux:环境变量】

但与其不同的是,自己写的程序在执行时,需要带路径,但我们使用程序命令(例如:ls,pwd等等)都不用带路径是因为该命令已经添加到环境变量中。,以:划分的区域是一个路径,bash在执行命令中时需要进行查找,查找的方式就是一个区域一个区域的查找。在登录操作系统时,系统中的很多配置就已经加载到了Bash命令中(内存),其中包括PATH,PATH是一个环境变量,查看环境变量中的内容就需要带$符号。命令行中启动的进程都是Bash的子进程,命令行参数的存在本质上就是通过选择不同的选项来定制不同的程序功能。

2024-08-09 18:32:30 570

原创 【Linux:进程优先级】

在操作系统中,进程的数量远多于资源,我们使用的操作系统绝大多数都是分时操作系统,因此,在资源分配上,操作系统有一个“基本公平”的原则,于是有了优先级。如果进程长时间不被调度就会造成饥饿问题。nice值是有范围的([-20,19],一共四十个数字),不能随便调度 同时优先级在普通用户下也不能频繁更改。优先级每一次调整都是从80开始。

2024-08-09 15:33:23 418

原创 【Linux:gbd基础调试】

gcc/g++默认的编译是release版本,而调试需要在Debug版本下,因此只需要在Makefile文件中添加-g即可把环境转换到debug环境下。

2024-08-05 14:20:28 504

原创 【C++:jsoncpp库的配置&&CMAKE的安装】

jsoncpp库的配置:

2024-08-03 11:48:56 454

原创 【设计模式:观察者模式】

观察者模式允许我们定义一种订阅机制。可在时间发生时通知所有的观察者对象、使他们能够自动更新。观察者模式还可以叫例子:观察者模式的流程可以结合公众号的消息推送进行理解:新闻公众号主要负责推送一些实时新闻,如果你一直订阅关注该公众号,那么该公众号就会一直给你推送消息。“公众号”就是主题,“你”就是观察者,

2024-08-02 17:23:37 194

空空如也

空空如也

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

TA关注的人

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