自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(41)
  • 问答 (4)
  • 收藏
  • 关注

原创 tcp拥塞控制的理解

tcp的拥塞控制为什么需要,因为如果发送者发送数据过快,接收者来不及接收,那么就会有分组丢失。为了避免分组丢失,控制发送者的发送速度,使得接收者来得及接收,这就是流量控制。流量控制根本目的是防止分组丢失,它是构成TCP可靠性的一方面。为了避免这个现象我们引入了一个滑动窗口,每当接收方的与发送方发送数据的时候我们就告诉发送方剩余缓存中空间的大小,以便于发送方的发送控制,但这个有时候出现一种死锁的问题,接收方的窗口为0,通知发送方没有空余的缓存,然后一段时间后又开始出现了多余的缓存,接收方通知发送方,但是通知

2021-08-23 09:43:23 230

原创 1727 重新排列后最大子矩阵

class Solution {public: int largestSubmatrix(vector<vector<int>>& matrix) { int n = matrix.size(), m = matrix[0].size(); for(int i = 0; i < m; i++){ for(int j = 0; j < n; j++){ if(j>

2021-08-22 22:10:26 80

原创 tcp为什么需要3次握手而不是2次或者4次

tcp本来就是一个恶劣的环境的环境中进行数据包的传输,tcp是运输控制的协议,IP是网络层的协议,tcp主要在数据头部封装数据的格式,ip是在数据包的头部封装接收端的地址,以至于数据包知道往哪里发,然后如果出现了阻塞失真还可以重复发1 防止失效的连接请求报文段被服务端接收,从而产生错误。2 若建立连接只需两次握手,客户端并没有太大的变化,仍然需要获得服务端的应答后才进入ESTABLISHED状态,而服务端在收到连接请求后就进入ESTABLISHED状态。此时如果网络拥塞,客户端发送的连接请求迟迟到不了服

2021-08-22 16:30:03 295

原创 leetcode 79单词搜索

class Solution {public: bool exist(vector<vector<char>>& board, string word) { //row for(int i = 0; i < board.size(); i++) //col for(int j = 0; j < board[i].size(); j++) //从word下标为0开始遍历

2021-08-21 22:20:50 75

原创 qt opencv环境配置

首先必须有qt的环境,这个你去官网下载就好了,然后是opencv的包,这里有个我提供的免费资源:链接:https://pan.baidu.com/s/1y2oyjjVSiOa78BEoYi7n_w提取码:12341 解压后出现以下目录:2 添加环境变量:下载的opencv的目录下有3 创建qt项目并且修改debug为release:4 右键qt项目,添加外部库:点击下一步库文件那里点击浏览:记得vc14还是15根据你电脑来选然后点击完成5 修改配置文件.pro:将

2021-08-21 10:48:28 380

原创 qt 子窗口操作父窗口

今天早上看一个项目的时候终于解决了困扰多天的一个问题,我之前一直不清楚如何在子窗口操作父窗口上的控件,比如改变值,显示,其次我在很多软件上看到了这种操作,比如qq,b站。困扰我问题的缘由是写串口助手的时候,颜色的设置。我想通过父窗口一个按钮,弹出子窗口,然后再子窗口操作父窗口,比如这样:只要按下确定按钮,就可以改变父窗口的颜色我之前写的方案也可以实现这个操作,但总是慢一步,父窗口总是要等到某种状态保存了,才能检测到然后发生改变,我在网上查了很多资料,基本没有,我也想了多线程去操作。不过今天终于找到

2021-08-20 10:10:49 3408

原创 冒泡与选择排序

冒泡排序:相邻元素两两比较,每轮可以确定有一个大的数字排在后面,主要是搞懂比较的轮数与比较的次数。第一轮确定1一个数字位置第二轮确定2个数字位置所以是n-1-i#include <stdio.h>#include <stdlib.h>#define n 10int main(){ int a[n]={1,3,2,4,6,8,7,5,10,9}; int i,j,temp; for(i=0;i<n-1;i++){

2021-08-16 11:52:48 58

原创 递归的理解

先看一个程序:#include <stdio.h>void fun(int a){ printf("aaa=%d\n",a); if(a>10) return; a++; fun(a); printf("bbb=%d\n",a);}int main(){ fun(1); return 0;}这个递归实现了递去,和归来。递归必须要有终止条件,递归和传统的循环是不一样的,我们打开一个函数就是打开一个层,传统的循环是不会造成内存泄漏的,但是递归会造成栈溢出,因

2021-08-16 10:45:05 100

原创 redis 事务机制 乐观锁 悲观锁

组队成功组队取消组队的时候出现一条错误,其他命令都无法执行。组队成功命令哪个失败就失败了:redis中为什么有事务冲突机制?假如你有一个账户里有10000元,有三个人同时直到你账户密码,都可以买东西那么会出现以下情况:买了8000剩2000,再买5000,超3000,再买1000,超4000利用悲观锁可以解决这个问题,悲观锁就是很悲观,认为别人总会修改这个数据,每次操作的时候都会上锁,直到完成了才会解锁乐观锁就是用版本号,所有人都可以得到第一版本的数据,下来每个人都要判断第二版本

2021-08-15 09:31:02 93

原创 redis基本数据类型 zset

redis 有序集合zset与普通集合set十分相似,是一个没有重复元素的字符串集合。但是redis每一个成员关联了一个score,这个score被用来按照最低分到最高分的方式排序集合中的成员,集合中的成员是唯一的,但是评分可以是重复的。zadd key score1 value1 score2 value2:添加元素:zrange key start stop 返回有序集合中 下标在start stop之间的元素:zrangebysocre key minmax [] [] :找出排名在这个

2021-08-14 21:18:07 119

原创 redis hash数据类型

redis hash是一个键值对,是String类型filed和value的映射表。hset key field value:向集合添加元素:hget key field value:从集合中取值hmemset key field1 value1 field2 value2向集合添加多个元素hexists key1 field:查看哈希表中,给定域field是否存在:hkeys key: 列出该hash集合中所有field:hvals key:列出该hash集合中所有value:

2021-08-14 21:00:55 79

原创 redis基本数据类型---set

sadd key value1 value2:将一个或多个元素加入到集合中,如果元素重复则忽略smembers key 取出key中的值:**sismember key1 value:**判断元素是否在集合中,在1 不在0:**scard key:**返回元素个数:srem key value:山粗集合中的元素:spop key随机从集合中吐出一个值**srandmember key1 n:**随即从集合中吐出几个值:**smove key1 key2 value:**将key1

2021-08-14 20:39:12 65

原创 redis常用数据类型 List

redis 列表是简单的字符串列表,按照插入顺序进行排序,你可以添加一个元素到列表的头部或者尾部他的底层实际上是一个双向链表对两端操作性能很高,通过索引下标操作中间的节点性能会较差lpush/rpush key value1 value2 value3从左边或者右边插入一个或者多个值lrange key value1 value2 value3 start stop按照索引下标获得元素从左往右:从这里看出这个LIst如同栈的数据结构一样存放数据lpop/rpop key从左边或者右边吐出一

2021-08-14 17:25:48 65

原创 redis常用数据类型 String字符串

String是redis最基本的类型,String类型是二进制安全的,二进制安全就是只关心二进制化的字符串,不关心具体格式,只会严格的按照二进制的数据存取,不会妄图以某种特殊格式解析数据。意味着redis的String可以包含任何数据,比如ipg图片或者序列化对象等等一个redis中的value最多可以是512M常用命令:set key key:**get key:**查询对应键值append key value 将给定的value追加在原值的末尾:**strlen key:**获得值长度

2021-08-14 16:56:22 124

原创 redis 基本操作

redis的默认16个数据库,类似数组下标从0开始,初始默认0号库。切换库:redis支持各种数据类型,redis是单线程但是利用多路io实现复用。redis key操作:五大基本数据类型:StringListSetHashZsetredis基于key1 keys * 查看当前库中所有的key:exists key 查看某个key是否存在:type key 查看键的类型:del key 和unlink key 删除指定的key 数据:unlink key是根据v

2021-08-14 16:01:34 91

原创 Linux网络项目

服务器端:#include<stdio.h>#include<string.h>#include<stdlib.h>#include<unistd.h>#include<fcntl.h>#include<string.h>#include<pthread.h>#include<sys/epoll.h>#include<ctype.h>#include<sys/socket.h

2021-08-10 13:33:08 207 1

原创 libevent的安装配置,以及例子

如何安装libevnt那?1 首先在虚拟机里面访问libevent的官网 https://libevent.org2 cd到下载的目录下3 tar -zxvf libevent-2.1.8-stable.tar.gz 解压压缩包,解压后有一个目录:进入这个目录可以看到解压后的文件:4 .执行/configure命令 检查安装环境 生成 makefile5 执行make命令 生成 .o 和 可执行文件6 执行sudo make install 将必要的资源cp置系统指定目录。7 进入

2021-08-08 11:31:26 288

原创 QML Calendar和ComboBox

//导入模块import QtQuick 2.6import QtQuick.Window 2.2import QtQuick.Controls 2.2//控件的导入模块import QtQuick.Controls 2.0import QtQuick.Layouts 1.0import QtQuick.Controls 1.4 as CTRLimport './1.js' as JIEWindow { visible: true width: 640 height

2021-08-07 16:33:53 249

原创 qml checkbox控件

//导入模块import QtQuick 2.6import QtQuick.Window 2.2import QtQuick.Controls 2.2//控件的导入模块import QtQuick.Controls 2.0import QtQuick.Layouts 1.0import './1.js' as JIEWindow { visible: true width: 640 height: 480 title: qsTr("Hello World")

2021-08-07 16:16:27 227

原创 线程池描述结构体

基于上篇文章线程池描述的结构体分析:struct threadpool_t { pthread_mutex_t lock; /* 用于锁住本结构体 */ pthread_mutex_t thread_counter; /* 记录忙状态线程个数de琐 -- busy_thr_num */ pthread_cond_t queue_not_full; /* 当任务队列满时,添加任务的线程阻塞,等待此条件变量 */ pt

2021-08-07 10:44:36 140

原创 线程池模型原理分析

普通server端处理客户端的数据,客户端有数据开启一个线程,最后再把线程回收,但是这样耗费资源,时间长我们利用线程池,线程池在服务器与客户端连接建立之前就已经创建,服务器内部有一块公共的区域,在客户端没有数据发送来的时候,线程池阻塞无数据阻塞:在客户端有数据的时候,服务器先发信号唤醒阻塞的线程池线程池在创建之前,要注意能创建处理线程的最大数目和最小数目,线程中忙碌的数目,假如一个服务器有一段时间只有很好的数据要处理,那就要考虑对线程池瘦身,否则扩容,这就类似于银行系统在晚上的后半夜几乎很少有数

2021-08-07 10:32:49 391

转载 一文彻底了解红黑树

红黑树简介红黑树是一种自平衡的二叉查找树,是一种高效的查找树。它是由 Rudolf Bayer 于1972年发明,在当时被称为对称二叉 B 树(symmetric binary B-trees)。后来,在1978年被 Leo J. Guibas 和 Robert Sedgewick 修改为如今的红黑树。红黑树具有良好的效率,它可在 O(logN) 时间内完成查找、增加、删除等操作。因此,红黑树在业界应用很广泛,比如 Java 中的 TreeMap,JDK 1.8 中的 HashMap、C++ STL 中的

2021-08-07 09:12:28 551

原创 QML中的几种布局

所有的代码都在这里,可以注释别的布局来运行一个布局的代码//导入模块import QtQuick 2.6import QtQuick.Window 2.2//控件的导入模块import QtQuick.Controls 2.0import QtQuick.Layouts 1.0import './1.js' as JIEWindow { visible: true width: 640 height: 480 title: qsTr("Hello World"

2021-08-06 21:25:06 1672

原创 QML导入js文件

1 在项目路径下创建js文件2 右键项目添加现有文件,导入1.js3 编写1.js代码//js文件function yunsuan(number){ this.number=number this.add=function(num){ return number+num } this.sub=function(num){ return number-num }}主界面代码://导入模块import QtQuick

2021-08-06 15:01:25 459

原创 qml button信号与槽

//导入模块import QtQuick 2.6import QtQuick.Window 2.2//控件的导入模块import QtQuick.Controls 2.0Window { visible: true width: 640 height: 480 title: qsTr("Hello World") Button { text: "Button" onTextChanged: {

2021-08-06 14:32:23 317

原创 QML的一些可视控件

QML中有许多可是控件,大家在QT的官方文档中可以找到:这里只举了几个例子://导入模块import QtQuick 2.6import QtQuick.Window 2.2//控件的导入模块import QtQuick.Controls 2.0Window { visible: true width: 640 height: 480 title: qsTr("Hello World") Column{ Button{

2021-08-06 14:15:26 199

原创 创建QML项目

QML是一种描述性的脚本语言,文件格式以.qml结尾。语法格式非常像CSS(参考后文具体例子),但又支持javascript形式的编程控制。QtDesigner可以设计出·ui界面文件,但是不支持和Qt原生C++代码的交互。QtScript可以和Qt原生代码进行交互,但是有一个缺点,如果要在脚本中创建一个继承于QObject的图形对象非常不方便,只能在Qt代码中创建图形对象,然后从QtScript中进行访问。而QML可以在脚本里创建图形对象,并且支持各种图形特效,以及状态机等,同时又能跟Qt写的C++代码进

2021-08-06 13:59:22 321

原创 QT label设置图片界面美化

以前写QT发现别人的界面很好看,今天来试试1 首先新建一个qt工程,要带ui界面2 在ui界面上面,拖动四个label标签3 点击设置标签的属性里面,有一个pixmap,点击进去选择资源文件,然后就可以设置了运行如下:...

2021-08-06 13:02:43 1323

原创 epoll的ET非阻塞模式

readn调用的阻塞,比如设定读500个字符,但是只读到498,完事儿阻塞了,等另剩下的2个字符,然而在server代码里,一旦read变为readn阻塞了,它就不会被唤醒了,因为epoll_wait因为readn的阻塞不会循环执行,读不到新数据。有点死锁的意思,差俩字符所以阻塞,因为阻塞,读不到新字符。LT(level triggered):LT是缺省的工作方式,并且同时支持block和no-block socket。在这种做法中,内核告诉你一个文件描述符是否就绪了,然后你可以对这个就绪的fd进行IO操

2021-08-06 08:43:23 839

原创 进程间的通信-管道

管道是UNIXIPC的最老形式。并且所有的UNIX系统都提供此通信机制,但是管道由两种限制:1 它是双工的,只能向一个方向流动。2 它只能在具有公共祖先的进程之间使用,一个管道由一个进程创建,然后该进程fork,出来的父子进程之间就可以用管道管道是由pipe函数创建的#include <unistd.h>int pipe(int fileds[2]);//成功返回0 失败-1fileds[0]是为读而打开fileds[1]是为写而打开fileds[1]的输出是filed是[0

2021-08-05 22:19:28 86

原创 VS2015 opencv环境配置

1 下载opencv包链接:https://pan.baidu.com/s/1y2oyjjVSiOa78BEoYi7n_w提取码:12342 解压后出现以下目录:3 打开VS2015 新建一个空的win32控制台项目4 打开这个VIew otherwindow 里面有一个Property Manager5 设置项目编译:6 打开第一个的属性:vc++设置:在LINK的input中设置:这个就是opencv目录下的第一个一般就设置这三个就好了,里面的路径按你下的路

2021-08-05 14:20:06 415

原创 unix漏桶的实现

漏桶就是好比一个装有水的桶,往下漏水,但是一次只能漏一点点水,直到漏完,就好比程序中有100000条数据也只能一次读10条那样读。#include <stdio.h>#include <stdlib.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <unistd.h>#include <errno.h>#incl

2021-08-03 16:30:25 72

转载 MFC中stdafx.h

这个大佬对这个头文件理解很深刻,转载一下https://www.cnblogs.com/MuyouSome/p/3380033.html

2021-08-03 11:10:38 209

原创 具有竞态条件的程序

#include <stdio.h>#include <stdlib.h>#include <sys/types.h>#include <unistd.h>static void a1(char*);int main(void){ pid_t pid; if((pid=fork())<0){ perror("fork error\n"); }else if((pid=fork())==0){ a1("out from child\

2021-08-03 08:31:57 84

原创 fork函数

由fork产生的新进程叫做子进程,该函数被调用一次,但是返回两次,子进程会返回0,而父进程返回子进程的进程ID。子进程是父进程的复制品,子进程获得父进程数据空间、堆和栈的复制品,这只是子进程的拷贝,父进程不与他共享这些存储空间部分,如果正文段是可读的,那么父子进程只共享正文段。#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <sys/types.h>int glob=

2021-08-02 21:46:29 93

原创 longjmp对自动 寄存器 易失变量的影响

简单来说setjmp函数,如果直接调用返回0,如果从longjmp调用返回非0.longjmp 函数的功能是从 jmp_buf 结构体中恢复由 setjmp 函数保存的上下文,该函数不返回,而是从 setjmp 函数中返回。参数 env 是由 setjmp 函数保存过的上下文。参数 val 表示从 longjmp 函数传递给 setjmp 函数的返回值,如果 val 值为0, setjmp 将会返回1,否则返回 val。longjmp 不直接返回,而是从 setjmp 函数中返回,longjmp 执

2021-08-02 17:10:37 120 1

原创 命令行参数

c语言中int main(int argc,char **argv)到底是什么:其实第一个参数是标准输入的参数个数,第二个是标准输入的参数内容。看例子:#include <stdio.h>#include <stdlib.h>int main(int argc,char** argv){ for(int i=0;i<argc;i++){ printf("argv[%d]: %s\n",i,argv[i]); } exit(0);}...

2021-08-02 15:36:25 68

原创 atexit函数

#include <stdlib.h> int atexit(void (*function)(void));这个函数如同Java中的析构函数一样,先调用的后执行,后调用的先执行。例子如下:#include <stdlib.h>#include <stdio.h>static void my_exit1(void),my_exit2(void);int main(void){ if(atexit(my_exit2)!=0){ perror("..

2021-08-02 15:26:58 85

原创 第一个jQuery例子

jQuery是一个js脚本库,方便了程序员的使用。首先要想使用必须在官网下载:http://jquery.com1 jquery的工厂函数:在jQuery中无论那个类型的选择符都需要从一个"$“符号和一对”()"开始,在()使用字符串参数,参数中可以包含任何CSS选择符表达式在参数中使用标记名:$(“div”): 用于获得文档中全部的在参数中使用ID:$("#username"): 用于获得文档中ID属性值为username的一个元素在参数中使用CSS类名:$(".ok") 用于获得文档

2021-08-02 10:17:11 171

原创 QT五子棋项目

今天给大家带来一个QT的五子棋项目,没有用到xml文件,界面都是纯代码写的,这个项目的主要难点在于得分的计算、输赢的判断逻辑、界面的规划,用到了paintevent等事件,以及定时器的技术,主要写了两个类一个是主界面的,另一个是是关于游戏模式的类,因为这个可以实现人人对战,与人机对战。首先来看运行如下:1 项目的目录结构如下:2 mainwindow.h:这个就是主界面的头文件,因为主界面上的菜单栏要选择游戏模式,所以和gamemodel类交互必须包含gamemodel的头文件。#ifnde

2021-08-01 21:54:13 988

空空如也

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

TA关注的人

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