- 博客(119)
- 收藏
- 关注
原创 Elasticsearch索引创建与搜索
进行post请求 /user是自定义索引名,/_doc是索引类型,都这么写的。KV形式的插入,中间用,隔开其中不可以换行。创建索引及关键字时使用。
2026-03-28 23:20:19
200
原创 etcd和brpc的联合运作在即使通讯系统中的原理
写入成功后,etcd就开始自动续约,只要服务器进程存活,租约就永不过期,服务地址就一直存在于etcd中。在项目中我们不需要构造etcd的服务器,仅需要构造服务端进行服务发现和服务注册,所以etcd的作用就是进行已知服务的发现和未知服务的注册,这里仅仅支持在一个base目录下自定义服务路径的注册,所以我们构造服务发现对象时需要指定base目录。服务器一直在指定端口上监听,当收到客户端的网络包后,服务器的网络线程接收数据,进行初步的协议解析,识别出这是一个RPC请求。etcd,brpc客户端和服务器的协作。
2026-03-28 19:50:07
750
原创 QT显示类控件---QSlider
我们使用QGraphicsScene,QGraphicsView,QGraphicsEllipseItem进行制作,这三个工具将来非常有用,主要可以进行绘制,图像旋转,运动等的操作,但是本人了解不多。使⽤Slider 表⽰⼀个滑动条,QSlider 和 QDial 都是继承⾃ QAbstractSlider ,因此⽤法上基本相同,由于样式出奇的丑,一般之后不会使用到。虽然QPainter也可以实现图片旋转,但是对比发现不需要还原坐标系的QGraphicsEllipseItem还是太方便了!
2025-12-20 15:58:22
381
原创 qt显示类控件---QDial
所有的控件显示或者其他的函数方法都是可以进行重写的,由于原本固定的paintEvent没有实现显示刻度数字的功能,我们采用画笔进行不改变样式的基础上重写。案例2:重写paintEvent方法,给QDial添加刻度数字(比较难)QDial是旋转按钮,能显示圆形刻度但是无法显示刻度的具体的值。画的位置有点复杂,需要数学知识。案例1:调整窗口透明度。
2025-11-18 12:08:22
384
原创 qt输入类控件---QDateEdit/QTimeEdit/QDateTimeEdit
QDateEdit是日期微调框,QTimeEdit是时间微调框,QDateTimeEdit是时间日期微调框。案例2:实习时间间隔计算机。案例1:核心属性及信号。
2025-11-18 11:54:38
262
原创 qt输入类控件---QComboBox/QSpinBox
使⽤ Q SpinBox 或者 QDoubleSpinBox 表⽰"微调框",它是带有按钮的输⼊框.可以⽤来输⼊整 数/浮点数.通过点击按钮来修改数值⼤⼩。QComboBox 是下拉选择框, 也叫选项列表控件。核心方法也是属于成员函数。
2025-11-17 01:07:56
603
原创 qt输入类控件---QLineEdit/QTextEdit
QTextEdit 表⽰多⾏输⼊框.也是⼀个富⽂本&markdown编辑器. 并且能在内容超出编辑框范围时⾃动提供滚动条。这个的用法和单行的差不多。主逻辑还是很简单的,由于部分立体效果在当时使用完成,这个暂时完成百分之80。案例3:微仿小新pro16笔记本电脑登入输入密码的界面(有修改,差不多就行)(比较难)QLineEdit ⽤来表⽰单⾏输⼊框.可以输⼊⼀段⽂本,但是不能换⾏。案例2:使⽤正则表达式验证输⼊框的数据。案例1:核心方法及信号的演示。多行输入框QTextEdit。案例1:核心属性和信号演示。
2025-11-17 00:50:56
666
原创 qt显示类控件---QLCDNumber
案例4:使用QMetaObject::invokeMethod方法实现不使用信号形式的倒计时(非常难)QLCDNumer 是⼀个专⻔⽤来显⽰数字的控件.类似于"⽼式计算器"的效果。从本节开始会出现一些比较难,比较超纲的案例,这里会标出,请按需掌握。案例3:使用Qmovie帧动画实现倒计时(比较难)意在让处于子线程中的修改逻辑强行压入主线程中执行。由于无法在子线程中修改控件的信息,我们使用。案例2:倒计时(中等难度)案例1:相关属性使用演示。
2025-11-15 16:04:07
682
原创 qt显示类控件--- Label
QLabel这个组件表示标签,用于显示图标和固定最大长度的文字。案例3:⽂本对⻬,⾃动换⾏,缩进,边距。案例1:显示不同格式的文本。案例四:设置伙伴关系。
2025-11-15 15:26:09
293
原创 按钮控件QPushButton,QRadioButton,QCheckBox及其三态属性
普通按钮QPushButton一般不设置clicked(bool)信号,普通按钮设置这个默认是没有效果的,必须手动设置isCheckedable(true)才会有点击成功效果。text(),isChecked(),setTristate(bool),CheckState checkState(),toggled信号。像setText,geometry这种基本的所有组件都有的就不说了。由于按钮状态的变化只有按下和没有按下,所以toggled信号对单选按钮也生效,对于三态的复选框就无法准确的反应这个信号。
2025-11-03 01:06:22
417
原创 focusPolicy/setFocusPolicy(FocusPolicy),styleSheet
【代码】focusPolicy/setFocusPolicy(FocusPolicy),styleSheet。
2025-11-02 22:47:14
252
原创 windowOpacity/setWindowOpacity(float),cursor()/setCursor(QCursor),QPixmap
【代码】windowOpacity/setWindowOpacity(float),cursor()/setCursor(QCursor),QPixmap。
2025-11-02 22:40:45
118
原创 released信号,windowIcon/setWindowIcon(QIcon),qrc机制
相比clicked信号需要就地完成整个点击松开过程才触发,released信号只需要松开就行,而且不需要就地松开。取完名字之后要记得选添加到项目,不然隐藏了!普通按钮的released信号。
2025-11-02 22:33:23
261
原创 信号与槽(2),geometry/frameGeometry,控件的enabled属性,按钮的press与clicked(bool)信号
Widget.hQ_OBJECTpublic:signals: //自定义信号以void为返回值,并且必须放入signals//signals: 是 Qt 中用于声明 信号函数 的特殊区域//输出型参数,外部传入的值可以输出到回调函数里面//它只能把数据从发射者 → 搬运到接收者的槽函数,方向单向、只读。//如果你想“让槽函数把结果再写回发射者”,必须改用别的办法。//信号函数携带的参数必须大于等于处理函数携带的参数public:~Widget();
2025-11-02 21:30:41
610
原创 初识QLabel,单行文本框,多行文本框,QDebug()输出,普通按钮,信号和槽(1)
QT中大多数组件的头文件和组件是一样的,尽量采用这种头文件包含方式,基本上所有的组件都包含setText方法来设置文本。初次认识只需要掌握setText(const QString)这一个给标签组件命名的方法(输入内容)。对于系统自带的信号和槽可以通过图标形象的看出,带有锯齿的就是槽函数,带有一个波痕的就是信号。是它返回的类型,第三个是展示可以输出的重载类型信息。我们会发现关于按钮的信号有5个,我们之后会一一介绍。我们也可以使用图形化界面进行更快速的绑定槽函数。单行文本框与多行文本框。
2025-11-02 21:02:14
374
原创 QT中通过代码实现hello world,以及理解qt对象树,QT的数据类型(简略易学版)
所以我们一般将变量创建在对上是为了new的时候可以直接挂在父节点上。怎么判断父节点是哪一个呢。对应的父类就是父节点。在qt中每一个子对象都可以直接受到父对象的管理,这样设计的好处就是当父对象销毁的时候会连带着其携带的子对象一起销毁了,相当于帮助我们销毁对象。所有的QT类型都是在原本对于传统的cpp类型的前面加上Q,比如QString,我们发现所有的源cpp字符串类型都是可以隐式转换的。创建一个标签,设置文本为hello word就很简单的实现了hello word的打印了。qt的头文件是和标签名一致的。
2025-10-24 20:30:48
412
原创 QT项目代码解释
所以我们如果要让拖入的图形化界面可以用ui这个指针进行访问需要先完成如下架构设置并且编译一下,才能生效。已进入qt的项目编辑区可以看见如下已经建立的三个文件,里面有预先创建的代码,我们进行解读其作用。
2025-10-24 20:01:44
249
原创 总线的控制
如果某一设备占用了总线的控制权。 另外,还可以通过软件的方式对总线控制部件进行设置是它的优先级的顺序得到,更灵活的改变。 比如说现在计数器的值是零,就对io接口零进行查询,看看io接口0上的设备是不是提出了总线占用请求,如果他没有提出总线占用请求,这个计数器就会自动的进行加1,接着对io接口1设备进行判断,接口是否提出了总线占有请求,如果io接口一提出了总线占用请求,接口一就会进行响应,通过BS这条线,进行应答表示io接口1被选中,当前总线很忙,接着io接口1就开始进行和别的设备进行通信了。
2025-09-27 00:57:03
877
原创 考研408---C语言复习
打开文件,否则在 Windows 上可能出错(换行符转换)。putchar和getchar只能支持单字符的输出和输入。文件的关闭也可以使用fclose(FILE* pf);do...while循环采用先执行后判断的形式。匿名结构体是不能调用,不可复制,不可重复利用。第一个参数传入char类型的进行强制类型转换。赋值运算符的运算优先级是很低的。计算机中的数据类型及其占字节数。,防止名字冲突和意外访问。一维和二维数组的初始化。:注意必须使用必须用。scanf的输入格式。do-while循环。
2025-09-20 22:49:37
419
原创 epoll
LT(默认):只要 fd 上的事件“仍然成立”,epoll_wait 就每次都会告诉你,所以这种情况可以随意的反复的根据epoll就绪信号反复读取,这个也是epoll模型就默认形式。由于ET模式算fd上需要关心的事件,所以将fd的读/写事件设置成ET模式,需要在原本关心的事件上|EPOLLET。epoll的目的是多个fd(io)事件的等待机制,达到事件派发的目的,就是当事件到达网卡的时候,每个 socket 的。这个两个fd的作用不一样的。)被触发,将就绪事件通知给用户空间,完成就绪事件的通知机制。
2025-09-07 00:01:45
824
原创 select/poll
接着研究pollfd结构,数组中每个元素就是pollfd代表一个关联的文件描述符,event是关联的事件,short本质是一个位图,也就是event是我们要内核帮忙关系fd上的哪些事件(读事件,写事件),revent则是内核告诉用户哪些fd上是哪些事件已经就绪了,这点就说明poll将事件就绪和设置分开了,输入输出信息分开了,不需要手动重置了,用户完全看revent里面的系统提供的就绪事件就可以了。我们要管理的就是这个数组而不是fd_set,所以当某个fd不需要的时候就要及时的将其移除。
2025-09-02 19:15:10
896
原创 文件I/O与多路转接(1)
虽然官方把「单位时间内完成的有效 I/O 次数(或字节数)」作为唯一判定依据——也就是“吞吐率 / 延迟”,假设每次io拷贝的数据量近似相等,我们可以通过无数个单位时间拼接起来,这时效率就变成整个io的过程中拷贝(传输)数据的个数,明显非阻塞式的肯定更多,所以效率更高。关于I/O,无论是read/write这种阻塞式的,还是我们后面会说到的非阻塞式的,阻塞式io本质就是通过网络发送数据,本质就是io的问题,io=等待数据进入缓冲区+read/recv/send等进行拷贝到别人的接收缓冲区。
2025-09-02 13:24:59
685
原创 Boost搜索引擎项目(详细思路版)
目录项目相关背景搜索引擎原理技术栈和项目环境导入数据到自己的本地数据去标签与数据清洗模块Enumfile(src_path, &file_list)递归式写入Parsehtml(file_list, &results)去标签bool Parsetitle(const string& file, string* title)拆分标题bool Parsecontent(const string& file, string* content)拆分内容bool Parseurl(const string& file
2025-08-16 17:09:55
1364
原创 应用层协议http(无代码版)
它们提供了关于客户端、请求内容、服务器期望的响应等关键信息,就是哈希表的结构,接着是空行,这个空行其实就是换行符,最后是请求正文,我们一个标准的http的request是需要有以上4个部分的,这个请求报头其实是可以没有的。我的数据给别人,别人的数据发送给我的本质是在做I/O,我们网上所有的行为都是在做I/O,我们通过url以及端口号进行通信,所以我们要获取资源首先要确定我们要的资源在哪台服务器上(网络,ip),在什么路径下(系统,路径)。而 Telnet 的数据是以明文形式传输的,容易受到窃听。
2025-05-27 22:21:16
1445
原创 MySQL事务
我们来学习MySQL事务什么是事务?事务就是一组DML语句组成,这些语句在逻辑上存在相关性,这一组DML语句要么全部成功,要么全部 失败,是一个整体。MySQL提供一种机制,保证我们达到这样的效果。事务还规定不同的客户端看到的 数据是不相同的。事务就是为了完成某项任务的逻辑相关的MySQL语句的集合。事务就是要做的或所做的事情,主要用于处理操作量大,复杂度高的数据。
2025-05-08 18:42:49
812
原创 MySQL的数据类型
我们今天来学习MySQL的数据分类。数据类型分类MySQL的字符型就是相当于字符串类型,所以MySQL没有字符这种说法,这个是和其他语言不一样的地方,单引号和双引号引起来的都是字符串。数值类型MySQL数值类型中整型的取值范围和C语言中的是一样的。我们接着只选择一些有代表性的类型进行讲解。tinyint我们可以称tinyint为微整型,从上表来看这个是整型里面最小的。
2025-04-28 20:30:21
1283
1
原创 (MySQL)表的操作
使用alter table ... add引导的插入一个新的列的语句,指定在哪个表上插入之后add后面写入新的字段名连带着类型,至于注释,约束可以不带,最后是指定这个新插入的列的位置,可以使用after+原有字段名表示插入在这个字段名之后,如果没有指定位置就默认添加到最后一列。[temporary]的意思就是暂时的,加上这个字段的意思就是只删除开启的临时的当前表的会话窗口而不会真的删除存在数据库的同名的真实的表。这次不指定位置就自动插入在结尾,并且插入非空约束,插入新字段后,对原来表中的数据没有影响。
2025-04-27 22:42:06
966
原创 (MySQL)库的操作
就是根据数据库名,删除对应的数据库,如果待删除的数据库存在则执行完后数据库内部看不到对应的数据库,对应的数据库文件夹被删除,级联删除,里面的数据表全部被删,所以可以添加字段约束[IF EXISTS]表示判断是否存在。大写的表示关键字,都可以使用小写,[] 是可选项,CHARACTER SET: 指定数据库采用的字符集,COLLATE: 指定数据库字符集的校验规则,然后[IF NOT EXISTS]是指明数据库不存在才创建。注意,由于MySQL内部的数据库有很多,所以查看时记得是databases。
2025-04-25 13:05:52
1104
原创 网络基础2
mac地址是在局域网标识一台主机的唯一性,二者的本质区别就是,一个报文从发送到被接受时,其携带的源ip地址和目的ip地址一般是不变的,假设这个报文需要通过主机或者路由器中转,那mac地址会由于中转的作用而发生改变,每经过一个路由器或者主机其源mac地址和目的地址就会发生改变,一般经过路由器时会重新分配mac帧,此时变成跨网段通信了,mac地址的格式就发生了比较大的改变,这时这个mac地址就不属于原本的局域网的了。我们整个的课程,凡是提到 IP 协议,没有特殊说明的, 默认都是指 IPv4。
2025-04-13 22:35:00
1745
2
原创 网络基础1
以打电话为例,语言层这层和通信设备层这层是分开的,我们打电话只需要向电话说出我们要说的东西,别人也这么说这是语言层的交流,但是实际上我们相互交流的那些话都是通过下层的通信设备层的那些设备进行传输的,这些设备遵循电话机协议实现,所以可以互通,我们在拿着电话交流的时候是不需要管下层那些设备有没有传输的,下层的那些设备是不需要管我们讲了什么的,反正只负责传输,将庞大系统分解为多个层级,每层只需关注自身职责(如网络协议中,应用层处理业务逻辑,传输层管理可靠性),软件分层实际上就降低了设计的复杂度。
2025-04-13 14:16:03
704
原创 其他常⻅的各种锁
写者进入内存中的某块空间中写,为了防止某个写者写的时候不被其他进来的写者打断,如果还没有写完,突然又来了一个写者就很容易导致当前写者被打断或者写的东西被覆盖导致数据丢失,所以写者和写者之间是互斥的关系,读者和消费者最大的不同就是不会拿走写者写的数据,读者只是一味的读,所以这个模型是可以兼容很多个读者一起来读的,反正你读你的,我读我的,我们读的都是内存中的某块空间的内容,读者和读者是并发的,读者和写者之间的关系是互斥和同步的,为什么互斥呢?通常而言,在读的过程中,往往伴 随着查找的操作,中间耗时很长。
2025-04-03 00:27:48
1024
原创 单例模式与线程安全
就是多个线程申请多个未释放的锁,然后他们各自却持有这些锁(未解锁),导致都需要等待对方释放,比如A线程持有锁a,B线程持有锁b,那B今天来申请锁A,A申请锁b,这样A,B线程都需要各自等待对方释放才能申请成功,跟那个shared_ptr的循环引用无法释放一样的道理。第⼀次调⽤GetInstance的时候,如果两个线程同时调⽤,可能会创建出两份T对象的实例, 但是后续再次调⽤,就没有问题了,此时inst就不是空了,不能创建对象了。⼀般⽽⾔,多个线程并发同⼀段只有局部变量的代码时,不会出现不同的结果。
2025-04-02 14:10:37
988
原创 模拟实现线程池
我们今天就用threadpool类模拟线程池,线程池内部会有很多的线程,然后这个线程需要实现我们用户手动传入事务,所以内部肯定有一个事务队列,然后我们可以通过equeue函数传入各种不同的事务到队列中,这个队列是没有长度的,实际长度取决于我们传入多少事务,然后线程池内部的线程不可能杂乱无章,我们可以将其提前创建限定个数然后装进一个数组里面,我们称为线程数组,然后里面的线程依次竞争队列的资源,所以可以看出线程池就是一个生产者-消费者模型。如果使用endl等下报错会有一堆,不好看的,不必要在这里浪费时间。
2025-04-02 00:06:32
988
原创 POSIX信号量
上面申请信号量的过程称为P操作,释放信号量的过程称为V操作,进行P操作时进行申请资源,信号量值减1,如果信号量值 > 0,则减1并继续执行,如果信号量值 = 0,则进程/线程阻塞等待,进行V操作时释放资源,信号量值加1,说明此时信号量不为0可以被申请了,如果有进程/线程在等待该信号量,则唤醒一个,然后进行信号量值加1。信号量就是进行线程间同步的一个工具,信号量就是一个初始值为1的带锁的计数器,线程不断的申请信号量,当信号量是大于0的时候是可以申请成功的,申请成功就--为0,当信号量为0时就不可以进行申请。
2025-03-31 22:33:49
891
原创 日志与策略模式
我们这次选择在文件中和在显示器中进行落盘,打印函数统一为synclog,将选择在显示器和文件分别进行类的封装,在各自的类中实现这个打印函数,这边是两个类都在各自的类中实现这个函数,将来打印当前方式有很多难道都在自己的类中独立实现吗,所以我们选择构建刷新策略父类,将其弄成抽象类,将本次的刷新方法构建成一个纯虚函数,然后让我们的刷新到不同地方的类继承这个刷新策略的类,然后重写纯虚函数进而实现数据的刷新,一个日志的构成需要有1。需要有刷新落盘,就是显示位置,往哪里写入,2的默认位置和1的日志等级已经解决了。
2025-03-31 21:04:10
1782
原创 利用生产者-消费者理论实现阻塞队列的读写
由于我们上面这个是单生产者-单消费者的模式,如果改成多生产者-多消费者,当生产者生产速度远远大于消费者消费的速度那就会有少数的生产者线程在等待队列却受到了大量的生产者发来的解除等待的信号,那大量的signal进行唤醒肯定会容易出错,再加上某些系统(如 Linux)可能为了性能,允许线程在未收到信号时提前唤醒,多个线程竞争锁时,由于不符合加锁条件,而唤醒对立线程,大量的signal某些线程可能被错误唤醒,这种情况称为伪唤醒,pthread_cond_wait允许伪唤醒。有线程进入等待队列就++,唤醒就--。
2025-03-29 14:49:57
668
原创 条件变量与生产者-消费者模型
当一个线程抢到票时会加锁抢票过程,抢完了会进行解锁(交出锁的动作),但是此时它自己也属于了外面正在等待锁的线程呀,那线程A刚刚解锁又瞬间加入了抢夺锁的线程当中,如果这个线程A的优先级非常高那每次抢到锁的都是它,这样线程A每次都是加锁,解锁,再抢到锁,再解锁...,难道线程A做错了吗,没有,但是这么多线程都在等,就线程A一个在使用这个锁,如果线程A只是频繁的加锁解锁而没有在临界区干什么事的话(生产者线程向工厂一样会源源不断的向缓存写入数据,如同工厂源源不断的向超市进货一样的,生产者的生产数据是。
2025-03-28 19:59:29
1253
原创 对锁进行封装
我们还可以仿造RAII的形式对锁进行保护,加一个保护类,私有成员自然是这个锁了,然后将一个锁的加锁和解锁分别放在一个这个类的构造和析构函数里面,然后在while循环里面构造保护类的对象,此时由于由于保护类对象属于这个循环区域的,刚刚创建出来的时候会之间构造,调用保护类构造函数加锁之前会先调用我们之前那个代码构造锁,完成加锁,然后等出了循环自动释放调用析构函数解锁,并调用锁本身的析构函数释放锁资源,从而实现自动加锁+自动释放的RAII形式。我们今天学习对锁进行封装。makefile编写。
2025-03-27 10:50:01
606
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅