自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 信号槽机制

下面我们实现一个案例: 我们可以创建一个按钮, 按下按钮后, 就会修改窗口的标题.​// 1. 创建一个 QpushButtonbutton->setText("按钮");// 2. 绑定信号与槽函数​​// 当点击按钮的时候吗,就会调用这个槽函数// 槽函数中修改窗口标题​this->setWindowTitle("窗口标题被修改");在 MainWindow 中声明的时候, 可以像普通函数一样声明, 也可以在槽函数前面添加 public slots。

2024-05-09 16:54:25 967

原创 Qt 窗口的坐标体系

Qt 中使用的坐标系也是平面直角坐标系,但是呢又和我们平时在数学中使用的坐标系是不同的,我们在数学中使用的坐标系是 x 向右增长, y 向上增长。所以我们在创建控件的时候就需要指定坐标,对于这个控件来说,坐标系原点就是相对于父控件/窗口的。所以我们前面使用代码创建控件的时候,没有指定控件的坐标,所以就默认在父窗口的左上角。我们可以使用 move 命令移动控件的位置。下面我们在添加 move 来移动这个控件的位置,看一下这个控件是否会被移动。所以Qt 中坐标的原点就是屏幕的左上角/窗口的左上角。

2024-04-21 10:41:05 467

原创 Qt 中 connect 函数使用

因为当我们点击按钮在松开之后,该按钮就会发射一个信号,这个信号就是 clicked 信号,那么我们就需要为这个信号绑定一个槽函数,然后当这个信号发出后,就会处理这个槽函数,那么我们需要如何绑定呢?那么这个控件的名字又是怎么起的呢?当我们编辑好之后,其实是没有啥太大的区别的,因为按钮主要的功能就是点击之后发生的事情,但是如果我们现在就运行的画,那么这个按钮是不会发生任何事情的,所以我们还需要为该按钮绑定一个槽函数。QPushButton 这个控件就在左边的一列中的 Buttons 中。处理信号的函数是什么。

2024-04-21 09:52:17 683

原创 黑盒测试用例设计

本节测试用例设计的方法主要有下面的内容:基于需求的设计方法等价类边界值因果图正交排列场景设计法错误猜测法。

2024-04-19 20:17:08 1333

原创 软件测试基础

需求分析:需求是否完整、是否正确 测试计划:确定软件由谁测试,什么时候结束测试,测试哪些模块 测试设计:编写测试用例(手工测试、自动化测试用例),编写测试工具 执行测试用例:执行测试用例 测试评估:测试人员产生一个测试报告。问题出现的环境 环境分为硬件环境和软件环境,如果是 web 项目,需要描述浏览器版本,客户机操作系统,如果是 app 项目,需要描述机型,分辨率,操作系统版本等。预期行为的描述 要让开发人员指导怎么样子=才是正确的,尤其要以用户的角度来描述符程序的行为是怎么样的。

2024-04-17 17:11:12 747

原创 测试基本概念

先看什么是需求,现在我们不仅仅局限在测试里面的需求,我们先把需求放在我们自己的需求: 当我们想要吃饭,或者我们想要看电视,这些都是我们的需求。需求在计算机中,可以被拆分为两个概念:用户需求软件需求用户需求:实际上和就是甲方提出来的需求,这些需求一般比较简略。下面举例一下,就是现在我想要一个可以交易的一个平台,那么这个就是一个需求。软件需求:软件需求也可以叫做功能需求,该需求必须详细的描述开发人员需要实现的软件功能。

2024-04-17 15:23:15 754

原创 Qt 的内存管理机制

那么下面我们就写一个代码,我们自己写一个类,这个类继承自 QLabel,当然继承其他的可以挂到对象树上的类也是可以的,因为 QLabel 可以显示出来,所以我们创建一个类继承自 QLabel,然后我们重写这个类的析构函数,我们在这个类的析构函数里面添加一个打印语句,这样我们就可以在释放的时候看到是否释放了。其实就是当我们关闭界面的时候,因为关闭界面了,说明我们已经不需要这个界面里面的控件显示了,所以我们理所当然的是可以将该控件释放掉的。此时我们看到的可能就是这样,那么此时的对象树是什么样子的呢?

2024-04-16 16:16:15 1317 1

原创 Qt 创建控件的两种方式

我们看到确实有 Hello World ,那么我们下面解释一下代码: 创建 label 对象的时候,我们使用了 QLabel 这个类,而这个类是 Qt 中自带的,所以我们可以使用,但是我们是需要包这个类的头文件的,我们前面也说了,Qt 中的头文件和你使用的这个类的类名是一样的,所以我们只需要包含 QLabel 这个类即可。我们在创建对象的时候,我们给了一个参数 this 指针,这个就是可以将该对象加到对象树上,加入到对象树之后,那么该当不适用该对象的时候,那么就会自动释放,就不需要我们来关心释放的问题了。

2024-04-16 15:00:35 896

原创 Qt 中默认代码

​在Widget构造函数中初始化列表中,使用parent 初始化基类还有一个就是我们刚才说的 ui ,然后初始化在构造函数中调用的 ui->setupUi 就是用来将 Widget 和 form file 绑定的。

2024-04-14 17:28:39 861

原创 QtCreater 使用

Application 也就是第一个,表示的是应用程序,我们还可以选择下面的,有C++ 还有Qt 文件,以及 java 和 python 等文件都可以创建,但是如果我们想要创建一个应用程序,那么我们就选择第一个 Application。QMainWindow 表示就是一个完整的窗口,QWidget 表示的是控件,还有 QDialog 表示的是对话窗口,前期我们只需要使用 QWidget 即可。⑥ 下面然后我们选择想要的类,因为选择的类不同,那么就是继承的类也就是不同的。目前这里有三个默认的类可以选择。

2024-04-14 16:41:14 289

原创 Z_library 网站

安卓建议使用,uc 夸克访问,pc建议使用 谷歌访问。

2024-02-21 13:12:20 397

原创 项目 高并发内存池

这里我会对这个项目做一个整体的介绍,因为我们的项目是需要在多线程的环境下跑,所以向 malloc 或者 new 这种函数是线程不安全的,所以是需要加锁的,但是我们的项目的锁竞争问题其实是较少的,为什么呢?我们看一下我们的项目的模型:我们的项目模型是分为三层的,如果现在有执行流来申请内存,那么首先会和自己的线程缓存申请,而线程缓存时每一个执行流特有的,也就是每一个执行流一个线程缓存,既然是每一个执行流一个线程缓存,那么也就是说线程在自己的线程缓存中申请内存是不需要加锁的,所以线程缓存就可以大大的减少加锁。

2024-02-06 13:46:50 812

原创 毕业设计 HTTP 自助服务

HTTP 服务是基于 TCP 的,虽然说 TCP 是面向连接的但是 HTTP 是无连接的,虽然 HTTP/1.1 可以进行长连接,但是我们的并不是长连接。这个项目我们从 sock 套接字开始编写,然后编写 TCP 服务器,基于 TCP 服务器,我们搭建了 HTTP 服务器,我们的服务只处理两种请求:GET 和 POST该项目还有 CGI 以及非 CGI 处理模式,如果是 非 CGI 那么就是返回资源,如果是 CGI 那么就让 CGI 程序处理用户请求后,返回数据。

2024-01-08 17:45:27 1015

原创 Centos7 静态连接失败解决

就是上图这种,这种的原因是因为静态连接是由交叉编译的,所以就需要指定连接的其他的动态库,所以就需要在编译的时候指定也就是带 -l 选项指定一下其他的库。如果是这个的话,那么可以在 -l 选项里面带一个 -ldl 的,这样就能解决上述的几个问题。如果没有 sudo 也可以直接在 root 下进行安装。解决方法:安装相关的静态库文件。就是显示无法找到 ....1.没有相关的静态库文件。2.静态连接时有一堆东西。

2024-01-08 12:12:16 437

原创 多路转接之epoll

在前面的高级IO(多路转接)中,我们看了 select 和 poll 但是前面两个多路转接都不是很好:1.select 需要大量的遍历2.select 需要维护第三方数组3.select 还会有大量的拷贝,从内核到用户,从用户到内核4.select 还有上限5.poll 解决了有上限的问题6.poll也不需要维护第三方数组,但是poll 还是会有拷贝,从内核到用户,同时也需要遍历以上就是前面学习的多路转接的缺点的一个小复习!

2024-01-03 09:23:25 847 1

原创 高级IO之多路转接

因为别忘了struct timeval 这个参数是输入输出的参数,当我们输入5秒后,那么就等待5秒,但是当5秒后还没有等到,那么输出的时候,表示剩余的时间,因为剩余的时间为0,所以 struct timeval 就是0,既然是0,那么我们又没有重新设置这个参数,所以表示下一次等待的时间是0,也就是非阻塞等待,既然是这样,那么就是每次都读取到是没有就绪,那么 select 的返回值就是0,也就表示的是没有文件描述符就绪!李四,如果没有鱼上钩的话,那么就去做自己的事情,然后过一会在检测,这个也就是非阻塞轮询。

2024-01-03 07:51:59 848

原创 数据链路程协议

数据链路层是在网络层的下面,而我们回顾一下其他层分别解决的问题: 1.应用层,解决应用问题 2.传输层,解决传输问题,保证可靠性等... 3.网络层,解决路径定位问题我们已经把数据传输的可靠性解决了,还有就是可以找到目标主机了,但是在实际的路由中,我们并不是由IP层将数据发送出去的,而是IP还需要交付给数据链路层,为什么呢?因为IP解决的是主机的定位我呢提,也就是路径选则的问题,那么在网络中,数据包实际上是从一跳到下一跳路由器走的,那么IP解决如何从这个路由器到下一个路由器了吗?并没有!

2023-12-19 20:36:11 900

原创 网络层协议

网络层协议也就是我们说的IP协议,我们知道每一层协议都是用来解决问题的,而TCP协议是用来解决数据如何可靠从一台主机到另一台主机的,那么IP协议是解决什么问题的呢?由于网络中发送数据,一定不是之间从这台主机到另一台主机的,而是从一个一个路由器上一跳一跳走的,而IP协议就是解决路径选择的问题的,那么有那么多路由器,我们应该选则去那一台路由器呢?这个就是由IP协议来解决!我们不论学习哪一个协议,我们都是需要解决两个问题的:1.如何封装和解包2.如何向上交付。

2023-12-18 08:53:23 1103

原创 传输层协议

上面我们学习到了关于TCP报头的知识,其中TCP是传输控制协议,而TCP也是就保证可靠性的。TCP的封装和解包: TCP的报头是 固定长度+子描述字段,固定长度就是20字节,而子描述字段就是4位首部长度。TCP的向上交付: TCP的报头中有源端口号,以及目的端口号,目的端口号就是TCP要交付给那一个进程。TCP的可靠性保证: TCP的报头中有32位序号和32位确认序号,以及16位校验和。

2023-12-16 16:17:45 145

原创 序列化与反序列化

我们就先介绍一下,我们今天打算如何写序列化和反序列化:我们打算写一个网络版本的计算器,客户端发送数据,服务器处理好后返回答案即可。所以我们需要一个客户端,还有服务器。客户端只需要做的就是生产数据,然后发送给服务器。服务器就需要接收数据,接收数据后,处理完成后,将处理结果返回。

2023-12-15 10:05:17 89

原创 https 协议

数据摘要就是对AC证书进行hash有映射,对证书进行hash隐私后,就形成了摘要,然后对摘要再进行AC机构的私钥加密后,然后形成数据签名。

2023-12-11 23:32:41 302 3

原创 HTTP协议

http协议就是上层,也就是应用层协议,该协议为超文本传输协议,其中我们经常使用的链接就是 https 协议。

2023-12-10 15:34:52 64 1

原创 TCP套接字编写

TCP套接字编写相对于UDP较难一些,目前我们还是只认为发送的数据就是字符串。下面我们看一下TCP套接字的编写。我们准备些一个服务器,一个客户端。服务器采用封装方式,客户端还是使用面向过程的方式。我们这次的TCP套接字编程会写几个版本:就是采用单进程的方式,来实现采用多进程的方式来实现采用多线程的方式来实现采用线程池的方式来实现单进程版本到多线程版本都是客户端发什么,服务器返回什么!到了线程池版本,我们可以写其他的一些方案:大小写转换(将小写转大写)英译汉。

2023-12-04 09:57:17 267

原创 网络套接字

一般我们使用最多的也就是这三种,但是实际上,我们最多就是会写两种,网络套接字和域间套接字,实际上我们最多还是网络套接字,所以下面我们主要以网络套接字为主,虽然套接字分为三种,但是我们使用网络编程的接口却只有一个,因为在设计的时候为了方便,同时因为这三种套接字如果设计不同的接口,那么差别也仅仅是函数参数有一点差别,实际上并无太大的差别,所以就设计为一种接口,而由于是三种套接字,所以函数参数的差别库函数的设计就是使用类似于C++的继承的方法。当然不是,因为如果是交给对方主机,那么对方主机能怎么做呢?

2023-11-30 22:38:59 215

原创 网络基础_1

不是因为全世界计算机记忆入网设备这么多,不可能是两台主机通信,如果每两台主机通信就需要一根网线,那么显然是不可能的,所以实际上数据的发送是通过路由器,将所有的局域网连在一起,而局域网的连接时通过路由器,所以距离很远的两台主机时通信很多路由器来数据传输的,所以如果两台主机距离很远的话,还需要通过友一个路由器到下一个路由器,所以还需要解决如何让从这个路由器到下一个正确的路由器。实际上,我们其实不关心物理层,我们只关系上面的几层,其中我们学习系统而TCP/IP就是再系统种实现的,所以我们更关心TCP/IP协议。

2023-11-30 22:34:39 276

原创 基于阻塞队列的生产者消费者模型

因为如果资源不满足的话,是需要wait的,wait是一个函数,既然是函数,那么就有可能调用失败,那么如果调用失败的话,如果底层使用的是数组迷你队列,那么此时就可能发生越界等等问题,如果使用的是 stl 那么最大容量可能就超了,也可能会直接奔溃,所以此时是有危险的,所以有可能唤醒是伪唤醒,所以这里需要循环判断,然唤醒的位置,继续在判断一次,如果满足条件的话,那么就去执行后面的代码!当有空位置的时候,那么就是资源满足,所以当消费者消费数据后,那么就资源满足了,所以当消费者消费数据后,那么就可以唤醒生产者。

2023-11-25 18:43:50 473

原创 基于环形队列的生产者消费者模型&线程池

那么当环形队列刚开始的时候,是没有数据的,那么当消费者想要消费的时候,一旦申请了信号量,那么就会阻塞住,所以此时一定是生产者来生成,当生产者生产资源后,那么就说明现在以有了数据资源,也就是可以让数据的信号量进行加加操作,也就是V操作,而当消费者在消费后,那么此时一定是有空位产生的没那么此时消费者也就可以让空位置的信号量加加也就是空位置的V操作。不访问也关系,我们可以后面去访问,即使后面去访问,那么一定还是有一个数据是属于我们的,那么当我们申请资源后,那么此时的数据的信号量一定是需要减减操作的。

2023-11-25 08:13:27 105

原创 线程同步——条件变量

还有两个函数是用来对条件变量操作的,和 mutex 基本相同,mutex 的操作有个 lock 和 unlock 操作,那么条件变量是用来控制同步的,那么当然需要控制线程的启动与终止,所以就有两个 wait 和 signal ,意思就是在对应的条件变量下面等待,还有就是唤醒等待的线程。此时你在排队的时候,你前面有一个又高又壮的男生,此时到他打饭了,然后他打完饭之后,瞬间就吃完了,然后他还是在打饭,就这样,他刚打完饭就吃掉,然后食堂阿姨又给打,就这样一直下去。

2023-11-15 07:55:45 75

原创 线程的互斥

一般情况下,如果函数是可重入的,那么线程就是安全的。如果函数是不可重入的,那么说明多线程访问会有问题,所以就不能多线程访问。线程安全的不一定是可重入函数,而可重入函数一定是线程安全的。例如:如果对临界资源访问加上锁,那么说明这个是线程安全的,但是如果这个函数是可重入的,那么当锁还未释放的时候就重入了,此时会竞争锁,此时救护产生死锁,所以是不可重入的。

2023-11-13 08:23:47 93

原创 线程的控制

性能损耗:如果再计算密集型的情况下,线程的数量大于处理器的数量,那么会引起性能损耗,因为计算密集型基本一直在使用CPU,但是如果线程较多的话,那么就需要切换线程,此时本来可以一直进程计算,但是线程多的话,还需要去切换线程,所以再计算密集型的情况下,一般不需要线程多。这里看试验结果,当线程被创建后 3秒,然后所有线程都退出了,包括主线程,而监测脚本也是3秒后一个i小鹌鹑都没了,所以我们也就可以得出试验结论, exit 是用于退出进程的,如果线程调用该函数的话,那么会导致整个进程退出。done #监测脚本。

2023-11-12 09:50:43 105

原创 线程基础概念

还有就是线程的私有栈结构里面的数据也是私有的,其实还有线程的id也是私有的,当然假设一个线程出错了,那么当然是需要有错误返回码的,那么如果错误返回码是共享的,那么就是有问题的,所以每个线程的错误码也是私有的,当然还有就是每个线程的重要性是不同的,所以线程的优先级也是不同的,所以线程的优先级也是私有的。线程运行于进程内部:同一个进程内部的线程使用的是同一个进程地址空间,还有页表等,所以同一个进程里面的线程看到的资源是相同的也就是同一个进程里面的线程都运行于这个进程的地址空间中,所以线程运行于进程内部。

2023-11-09 17:27:36 67

原创 信号的阻塞与递达

当我们一个进程不想要关心某个信号的时候,我们应该怎么做呢?那么有没有办法就是可以完全不用管某一个信号呢?其实时有办法的——阻塞信号!我们知道,信号是不一定会立马被处理的,所以信号就有一个保存的过程!信号产生————————>信号保存————————>信号处理信号未决 信号递达我们把处理信号的过程叫做信号递达当信号从产生到信号处理的过程叫做信号未决进程可以选择阻塞某个信号当一个信号被阻塞时,即使信号产生了(信号未决),信号也不会被递达,知道进程解除了信号阻塞,信号才会被递达。

2023-11-07 15:58:14 100

原创 Linux 信号

红绿灯闹钟电话铃声.....在日常生活中,上面以及很多东西都算是信号,那么这些信号的特点是什么?日常生活中的信号就是发生后,我们就可能要做一件事:当我们过马路时,遇到绿灯才可以通过,当我们看到我们的手机电话响了后,我们可能会接电话,也可能会挂掉,或者直接忽略掉,等....这些日常生活中的信号,我们有时候并不知道什么时候会发生,比如电话,我们并不知道谁会在什么时候给我们打电话。我们遇到一个信号后,也会做几件事,比如听到上课铃后,我们就会去上课。

2023-11-05 15:44:13 159

原创 进程间通信

命名管道实际上和匿名管道差不多匿名管道是操作系统帮我们创建的一个系统级别的文件,没有名字,所以只能通过父子进程继承的方式来获得文件描述符命名管道索然也是系统帮我们创建的,但是是有名字的,所以可以由没有关系的进程打开来共享,所以命名管道即使是不相关的进程也可以通信而匿名管道和命名管道是差不多的,只是实现进程看到同一份资源的手段不同而已。

2023-10-29 17:39:39 96

原创 特殊类的设计

既然我们只想要有一个该类的对象,那么我们可以提前创建一个该类的对象,也就是可以将该类的对象提前创建为一个 static 的一个对象,然后每一次调用就返回该 static 对象的引用。我们可以将该类的一个成员变量设计为该类的一个指针,如果我们是第一次调用 get 的话,那么我们就需要new 一个该对象,然后赋值给该指针,然后改回该类对象的引用。其实这里调用构造函数是不会失败的,因为 _single 是类内部的,类内部的成员是可以访问类的私有的没所以这里调用没有任何问题。

2023-10-15 17:05:07 298

原创 智能指针与定制删除器

下面我们就可以写我们的定制删除器,那么我们想要该类再析构的时候调用可调用对象来析构,那么当然是我们再构造的时候,或者是模板的时候就传进入一个仿函数,或者是再构造函数的时候再传入可调用对象,但是STL 库里面是再构造函数的时候传入的,所以我们也在构造函数的时候传入。这里为了支持我们的写入,我们需要提供一个 getPtr 因为我们写入的时候,需要文件指针,而我们需要提供getPtr 或者是将 _ptr 放成公有,才可以,这里选择提供getPtr。那么如果我们想要 new[] 呢?那么我们如何保存呢?

2023-10-15 13:50:00 109

原创 动静态库的使用与制作

一般情况下,我们发布一个库,我们的一个文件里面,有一个 include 文件,该文件里面包含的就是库的头文件,还有一个 lib 文件,该文件里面就是库文件。所以下面我们就可以创建一个 hello 的库,该目录里面有一个 include 和 lib 目录,这两个目录中一个是 .h 文件,一个是 .a 文件。下面,我们写一个自己的源文件,调用这里的函数,我们现在只把.h 和 .o 给别人,那么别人可以使用吗?但是光指明库文件的目录,还是不可以编译,因为我们不知道我们要链接哪一个库,所以我们还是需要指明库。

2023-10-13 10:55:42 52

原创 Linux 文件系统

当我们创建一个文件的时候,操作系统会帮我们到特定的分区中的块组中的 inode bitmap 中找一个空的,没有使用的 inode ,然后写入文件的属性,如果有数据的话,那么还回分配对应的 data block。inode Tbale:inode 大小为 128 字节,inode里面存的是对应文件的属性,所有文件的inode文件的集合,都要有一个inode编号,一般而言,一个文件,一个inode,一个inode编号。

2023-10-12 08:34:49 131

原创 C++11 智能指针

我们看下面一段代码,下面我们在 main 函数中中调用一个 test 函数, test 函数中调用 new 开空间等,还调用了 div 函数,div 函数里面如果发现有 0 ,那么就抛出除0错误。n1 什么时候释放?n1 这个节点由 n1 和 n2 的prev 共同管理,所以如果 n1 释放的话,那么就需要 n2 的 prev 释放了才释放。n2 什么时候释放?我们可以让引用计数是一个动态的,也就是引用计数可以也是一个指针,让管理相同空间的对象的引用计数也是相同的!

2023-10-10 12:07:50 101

原创 Linux 文件系统

下面我们说一下本次的学习顺序。首先我们会理解一下重定向,以及如何是实现重定向。接着我们理解一下缓冲区,以及缓冲区是在哪里的,还有就是缓冲区的作用是什么。最后,我们会模仿C语言实现一个自己的 FILE下面前面我们已经知道什么是文件描述符了。文件描述符实际就是数组下标。也就是 PCB 里面有一个指针数组,里面存的都是 struct file 结构的指针,而该结构体里面保存的是一些关于文件的内容属性,所以只需要找到对应的数组下标就可以找到相关的文件,就可以对对应的文件进行操作。

2023-10-09 10:50:02 108

空空如也

空空如也

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

TA关注的人

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