- 博客(54)
- 收藏
- 关注
原创 记录一次优化运行时间的经验,QTableWidget竟有这么大的坑
前两天接到一个任务:一个VS2015 + qt5 + osgEarth实现的项目,在向osgEarth场景中添加卫星时,用时过长。经过上面的操作,再运行,只花费了一秒多,哈哈哈哈完美!
2023-04-19 14:06:35
671
原创 C++类设计和实现的九大最佳实践
换句话说,如果被线程访问的对象的状态没有改变会怎么样?代码库中充斥着嘈杂的注释和不正确的注释,促使程序员忽略所有的注释,或者采取积极的措施隐藏它们。也许所面对的类控制了系统中太多的其他类,并且已经超出了应有的逻辑,成为了一个无所不能的类。新的C++标准实际上简化了许多令人沮丧的细节,提供了新的现代方法来改进C++代码,但让开发人员认识到这一点并不容易。实际上,一个主要缺点是,当为了修复bug或添加新特性而更改重复代码的实例时,所有对应的代码必须同时更改。如果一个类的实例是不可变的,那么该类就是不可变的。
2023-04-18 23:14:43
246
原创 记录一次使用qt多线程优化运行时间的经验
我急中生智又想到一个办法:Qt中主线程一直在刷新界面,主线程堵塞了,界面才会出现延迟,那我要是再定义一个与主线程异步的子线程执行算法,并将计算结果刷新到界面上,那用户就不会感受到延迟了,最多就是要等待结果刷出来,并不会影响下面的操作;但当我在网上搜索答案时,看到说Qt中只能在主线程(也就是GUI线程)中刷新界面,要是在子线程中刷新的话会有错误发生,所以我就将刷新界面的代码挪到子线程中,运行没有报错,完美!运行之后发现运行时间确实减少了,但是也很有限,当循环次数较多时,界面还是会感到延迟,那怎么办?
2023-04-18 11:16:14
1170
原创 c、c++中#pragam once作用是什么?
而#pragma once方式却不受一些较老版本的编译器支持,一些支持了的编译器又打算去掉它,所以它的兼容性可能不够好。方式一受c/c++语言标准支持,它不仅可以保证同一个文件不会被包含多次,也能保证内容完全相同的两个文件(或者代码片段)不会被不小心同时包含。但如果不同头文件中的宏名不小心“撞车”,可能就会导致你看到头文件明明存在,但编译器却硬说找不到声明的状况——这种情况有时非常让人郁闷。而且使用方式一时,编译器每次都要打开头文件才能判断是否重复,所以在大型项目中编译时间相对较长,方式二就应运而生。
2023-04-18 11:10:11
474
原创 编译linux版本osg osgearth 问题记录
CMake自动生成的Makefile不仅可以通过make命令构建项目生成目标文件,还支持安装(make install)、测试安装的程序是否能正确执行(make test,或者ctest)、生成当前平台的安装包(make package)、生成源码包(make package_source)、产生Dashboard显示数据并上传等高级功能,只要在CMakeLists.txt中简单配置,就可以完成很多复杂的功能,包括写测试用例。里面是一条条的命令,这也是为什么叫批处理的原因,批处理命令。
2023-04-10 14:11:28
999
原创 流程、制度与系统
真正顶级优秀的人,都用治理的方式管理组织。所以,我们做任何一件事都是有流程的,而“流程管理”或“流程优化”就是不断优化做一件事的过程,原来需要13步、8个人,优化后只需3步,2个人。军方改变了检查系统,每次交货前,都会随便挑几个降落伞,让厂家负责人亲自跳伞检测,从此,降落伞的合格率达到了100%。普通的人改变结果,优秀的人改变原因,顶级优秀的人改变模型。改变制度是改变结果,改变流程是改变原因,改变系统则是改变模型。我祝福你拥有看透本质,改变模型、改变系统的能力,用治理的方法管理企业,成为那个顶级优秀的人。
2023-03-07 11:22:02
440
原创 记录一次使用容器遇到的问题
调试后发现,使用下标遍历容器时,当删除一个元素时容器的size就会变小一个,删除n个就会变小n个,这样最后n个循环就不会进行,所以删除不掉最后n个元素;运行后发现,如果容器中含有多个name==sorName的元素,且有的在容器末尾,那就会存在末尾的几个不会被删除的情况;
2023-03-07 11:11:05
104
原创 c与c++程序员的编程修养
1.版权和版本好的程序员会给自己的每一个文件和函数都注明版权和版本;比如文件头部应该有这样的注释: /****************************************************** * 文件名:hello.cpp * 文件描述:提供一个打印hello world的函数 * 创建人:jinNiu.Yang * 创建时间:2021/12/15 * 版本号:1.0 * 修改记录: *******************************************
2021-12-25 23:10:17
2888
原创 Qt中的类
一.信号与槽1.QT元对象系统QT元对象系统提供三件事情: 1.QObject类 2.Q_OBJECT 宏,声明在类私有段中 3.moc编译器:为每个Qobject子类对象生成实现元对象特性(如信号槽)的代码。 moc读入c++源文件,若发现存在Q_OBJECT 宏的对象,就会将这个宏展 开生成moc文件,包含元对象实现的代码。2.connect 函数QMetaObject::Connection QObject::connect(const QObject *sender, con
2021-12-07 11:42:56
2468
原创 tcp头、三次握手、四次挥手
1. tcp头1 源端口和目的端口:找到目标进程,实现分用;2 序号(seq):tcp传送的字节流,每个都按顺序编号,首部中的seq是本报文段中首个字节的序号3 确认号(ack):两个作用,确认收到报文段和下一次希望收到对方报文段首字节编号;4 控制位: ① URG = 1,告诉系统此报文有紧急数据,尽快传送② ACK = 1,确认号才有效,tcp规定:建立连接后发送的报文段ACK都置1③ PSH = 1,应尽快向上交付给进程,不等缓存填满④ RST = 1,tcp连接严重错误,必须断开重连
2021-11-20 17:31:02
4865
原创 网络编程(API)
网络编程(API)一.tcp1.服务器端1)创建套接字(socket) int socket(int domain, int type, int protocol); 参数: domain:协议族,AF_INET type:通信类型,tcp协议为SOCK_STREAM protocal:具体的协议,一般为0,默认协议 返回值: 文件描述符2)将socket返回的文件描述符与本机地址和端口绑定in
2021-11-20 17:03:24
6488
1
原创 正则表达式
正则表达式1.什么是正则表达式?正则表达式就是一系列规则,通过这个规则可以在字符串中找到相关的内容;以下以c++语言使用正则表达式为例;2.正则表达式使用大致流程c++中正则表达式API基本在regex头文件中,使用正则表达式的大致流程:你有一段需要处理的文本,字符串、文本文件、日志等有一个特定目标,找出文本文件中所有的时间和日期等根据可能的格式写出具体的正则表达式,比如日期是2020-01-01,正则表达式可能是这样:\d{4}-\d{2}-\d{2}。将文本和正则表达式交给正则表达式引
2021-11-18 11:05:18
3409
原创 进程间通信 IPC
进程间通信 IPC1.无名管道 2.有名管道 3.信号 4.共享内存 5.消息队列6.信号量 7.SOCKET一.无名管道:创建无名管道: int pipe(int pipefd[2]); 参数 pipefd 读写端 返回值 成功与否 0:成功注:fd[0]表示read端,fd[1]表示写端;注:子进程继承父进程的fd,读端和写端注:这是父进程注:这是子进程父进程向子进程发送消息,关闭父进程read端和子进程write端,这样有两个好处,使
2021-11-14 17:03:49
1214
原创 QT项目建立、运行和发布的过程
一.QT项目建立、编译、运行和发布全过程1.新建项目在qt帮助文档中索引模式下搜索creating,就能找到创建各类项目的具体过程,如下图:创建成功后,项目目录中会包含六个文件,说明如下:.pro文件:项目文件,包含了此项目的相关信息;.pro.user文件:包含了与用户有关的项目信息;.h、.cpp、.ui分别是头文件、资源文件、界面文件;当写完程序并编译运行之后会发现项目目录中多了一个build文件夹,这就是默认的构建目录,里面保存了编译生成的文件,如下图:当然这个目录也是可以改
2021-10-24 02:00:40
615
原创 六. 请求到达Web服务器,响应返回浏览器
六. 请求到达Web服务器,响应返回浏览器1. 服务器概览介绍服务器程序的整体结构,以及启动后要做的准备;2. 服务器的接收操作介绍服务器的协议栈是如何接收数据的:首先看服务器怎么接收电信号并将其还原成数字形式的网络包,然后从里面提取出Http消息;之后看协议栈是如何将接受的消息通过Socket库传递给Web服务器程序的;3. Web服务器程序解释请求消息并作出响应4. 浏览器接收响应消息并显示内容...
2021-10-18 15:26:50
2959
原创 qt界面设计
设计界面时大概可以分三步:构造出需要的所有控件通过布局管理器确定控件位置通过样式表优化控件样式1.布局管理器1. QBoxLayout QHBoxLayout 水平布局 QVBoxLayout 垂直布局 1)setStretch 设置部件的拉伸系数 2)setSpacing 设置部件之间的距离 3
2021-10-08 17:40:13
6448
原创 四. 通过接入网探索互联网内部 ----探索接入网和网络运营商
四. 通过接入网探索互联网内部 ----探索接入网和网络运营商家庭和公司的内网是通过接入网连接到网络运营商的,互联网接入路由器发送网络包的操作和以太网路由器有一点不同,互联网接入路由器是按照接入网规则来发送包的。所谓接入网,就是指连接互联网与家庭、公司网络的通信线路。一般家用的接入网方式包括ADSL、FTTH、CATV、电话线等,公司则还可能使用专线。本章主要是讨论网络包如何通过互联网接入路由器,最终进入互联网内部的;1. ADSL接入网的结构和工作方式这节介绍ADSL接入网的结构、电话线中传输的
2021-10-08 11:35:42
825
原创 三. 从网络到网络设备 ----探索集线器、交换机和路由器
三. 从网络到网络设备 ----探索集线器、交换机和路由器这章主要看看通过网线传出去的包是怎么经过集线器、交换机和路由器等网络设备,最终进入互联网的?假设客户端计算机连接的局域网是下图这样(实际上家用路由器已集成了集线器和交换机的功能):1. 信号(电信号/光信号)在网线和集线器中传输1)信号从网卡中流出后是怎样在网线中经过集线器等设备前进的?当信号到达集线器后,会被广播到整个网络中(即连接在集线器上的所有设备);而以太网的基本架构就是将包发到所有的设备,然后由设备(网卡)根据接收方MAC地址来判
2021-09-22 11:42:58
388
原创 二. 用电信号传输TCP/IP ----探索协议栈和网卡
二. 用电信号传输TCP/IP ----探索协议栈和网卡本章的内容是探索操作系统中的网络协议栈和网卡是怎样将浏览器的消息发送给服务器的;1.创建套接字1)协议栈的内部结构应用程序:首先就是一些应用程序,他们会将收发数据等工作委派给下层部分来完成;下面是socket库,其中包含解析器、socket、bind、listen、connect等函数;操作系统:也就是协议栈,有两部分:上部分的TCP、UDP是接收应用程序委托,负责收发数据的部分;下部分的IP协议是分包和分组转发的驱动程序:负责控制网卡
2021-09-10 17:35:25
178
原创 一. 浏览器生成消息 --探索浏览器内部
一. 浏览器生成消息 --探索浏览器内部从在浏览器中输入网址,到屏幕上显示出网页的内容,在这个只有几秒钟的过程中,很多硬件和软件都在各自的岗位上相互配合完成了一系列的工作。本书将以探索之旅的形式,带领大家探索这一系列工作中的每一个环节。如下图:浏览器生成消息 ~探索浏览器内部1.生成http请求消息...
2021-08-22 14:12:57
200
原创 五. 详细解说GitHub的功能
五. 详细解说GitHub的功能GitHub有以下几个重要功能:键盘快捷键在各个页面按下shift+/都可以打开键盘快捷键一览表,查看当前页面的快捷键。Issue在GitHub上,Issue可以作为开发者之间的交流工具;遇到下面几种情况时,各位就可以使用这个功能:●发现软件的BUG并报告●有事想向作者询问、探讨●事先列出今后准备实施的任务Pull RequestPull Request是用户修改代码后向对方仓库发送采纳请求的功能,也是GitHub的核心功能。正因为有了这个功能,才会让众
2021-08-22 11:07:02
769
原创 四. 通过实际操作学习Git
四. 通过实际操作学习Git1. 基本操作1)git init ——初始化仓库必须先创建一个目录并初始化为git仓库,如果初始化成功,该目录下就会生成 .git目录,里面存储着管理当前目录内容所需的仓库数据;2)git status ——查看仓库状态只要对Git的工作树或仓库进行操作,git status命令的显示结果就会发生变化;所以操作中会不停的查看仓库状态;3)git add ——向暂存区中添加文件要是想让一个文件成为Git仓库的管理对象,就需要用git add命令将其加入暂存
2021-08-21 23:42:01
119
原创 三. 使用GitHub的前期准备
三. 使用GitHub的前期准备** 1. 使用前的准备**创建账户先进入官网:https://github.com/点击右上角的Sign up注册账户,按步骤填上邮箱、密码、昵称填上,并注册,之后登陆。设置SSH Key在GitHub上连接已有仓库时需要认证,使用了SSH的公开密匙认证方式进行;(问题:什么是SSH的公开密匙认证方式?)1)在Git Bash上运行下面的命令创建SSH Key:ssh-keygen -t rsa -C "your_email@example.co
2021-08-16 18:04:52
122
原创 二. 什么是GitHub?
二. 什么是GitHub?GitHub为开发者提供Git仓库的托管服务,是一个让大家共享代码的完美场所;GitHub还为开发者或团队提供了一系列功能,帮助其高效率、高品质地进行代码编写。1.GitHub一些功能概述Pull Request功能Pull Request功能使素未谋面的开发者们隔着半个地球的距离共同开发软件,开发者在本地对源代码进行更改后,向GitHub中托管的Git仓库请求合并。开发者可以在Pull Request上通过评论交流,例如:修正了BUG,可以合并一下吗?如图:GitH
2021-08-13 12:02:54
5060
原创 一. 什么是Git(版本管理)?
一. 什么是Git?Git是分散型版本管理系统,是为了版本管理而设计的软件;1. 什么是分散型版本管理?版本管理就是管理更新的历史记录;例如:记录一款软件添加或更改源码的过程、回滚到特定阶段、恢复误删除的文件等;而分散型就是说有一个原始仓库,其他的都是它不完整的副本,而这个副本都存在个人的电脑上,个人完成了一部分功能,上传后会备份到原始库中,如下图:2. 安装Git如果想在Windows下搭建Git,那msysGit是不二之选!msysGit是专门为Windows开发的Git工具(Git Fo
2021-08-13 02:03:06
409
原创 九. 核心与外部设备
九. 核心与外部设备计算机的核心设备只有CPU(控制器和运算器)和主存储器,但还需要一些外部设备来与核心部分通信,实现输入与输出,也就是IO设备(Input/Output);比如鼠标、键盘、显示屏、音响等;1. IO接口首先先看两个概念:模拟信号:连续变化的电压和电流称为模拟信号;数字信号:输入和输出计算机内核的二进制数可以代表特定的含义,称为数字信号;数字化:将模拟信号转变成数字信号的过程称为数字化;中央处理器和内存是通过内部总线连接起来的,可以直接传送数字信号。而外部设备(比如画图音响
2021-08-12 23:50:24
297
原创 八. 流水线和高速缓存技术
八. 流水线和高速缓存技术上一章里了解了使用集成电路制作半导体存储器和cpu,这把来研究一下他们之间的协同工作情况(CPU与主存):众所周知,CPU的处理速度是比存储器快很多的,而完成一个任务是需要从存储器取指令、译码、读写操作数、加减乘除等一系列操作,所以CPU大部分时间都处于等待状态;如图:CPU是非常昂贵的,而昂贵的东西应该保持忙碌才行,那有啥办法呢?1. 流水线作业CPU所做的工作可以分为三级:取指令、译码、执行;如果在每一步之间都加一个临时寄存器保存结果,那么这一步的电路就可以做其他的工
2021-08-11 13:08:49
503
原创 七. 集成电路时代
七. 集成电路时代众所周知,计算机的组成部分本质都是一些逻辑门电路。而使用什么来制造逻辑门电路就成了计算机的一部历史。1.继电器时代一开始,电学在磨磨蹭蹭地往前走,当然是越来越快。于是发明了电磁铁,也有了继电器。这个时候,电子计算机的先驱们也正处在彷徨之中,看到了继电器,觉得这东西挺好,都是合用的东西,可以拿过来用用。基本上,在20世纪30年代,他们都是在用继电器造那些最原始的计算机逻辑门电路。但是,他们造的机器,有的非常庞大,用了数不清的继电器,工作起来啪啪啦啦,而且效率也不高。2.电子管时代
2021-08-11 01:33:40
721
原创 六. 现代通用计算机(指令集)
六. 现代通用计算机到目前为止,已经可以将指令和数据提前放入存储器中,然后振荡器作为心脏驱动控制器自动从存储器中取出指令和数据,运送到运算器进行运算;而这就是现代的通用计算机吗?显而易见,它还太简单。1. 现代计算机的大体特征一般来说,存储器、寄存器和加法器,它们的数据引线具有相同的条数。比如说,如果数据线有8根,则存储器的每个存储单元包含8个比特,寄存器RA需要用8个上升沿D触发器来制造,而加法器呢,则必定是由8个全加器组合而成,如图:20世纪50年代的时候,有一个计算机公司决定把它的产品设计成
2021-08-10 14:13:02
497
原创 五. 全自动加法计算机(存储器)
五. 全自动加法计算机前面已经造出了运算器(可以计算一连串数字),但是每输入一个数都需要扳动开关,而且你需要去学习二进制;那可不可以把所有参与运算的数字预先存起来,然后用机器自动一个一个取出来再进行运算?当然,我们已经知道这个东西就是存储器。1. 使用触发器制造存储器如图,正方形的就是一个个的触发器,它可以保存一个bit,WR分别为写端和读端,而DB为输入/输出端;一行这样的触发器可以存储一个二进制数,为每一个行编号就是他的地址(也就是图中的层数),而这个能存储多个二进制数的电路就是存储器。地址译
2021-08-09 14:50:20
638
原创 四. 控制器与运算器(CPU)
四. 控制器与运算器前面我们已经造出了加法机,但是这种机器其实并没有什么卵用;首先需要人伺候着,不停地按动开关输入数据;其次它还只能计算两个数字,如果是多个数字就需要每次记下前两个数的结果,然后再输入这个结果和下一个数再运算,这会很麻烦;显然,我们还有一段路要走。1.使用寄存器保存中间数前面我们也造出了寄存器,就可以用到这里来保存中间数(即前两个数的运算结果),最后计算的结果也一样保存到寄存器。寄存器符号如下图:注意: cp端左侧的三角形表示该寄存器只在cp脉冲的上升沿才工作;将寄存器与加法器按
2021-08-05 20:20:52
3368
原创 三. 振荡器与寄存器
1.振荡器像这样的电路,当电源通上电后继电器J由于电流的磁效应而有了磁性,吸附开关使其断开;断开后电路又断电,开关又闭合了;只要电源有电,这个电路就会一直开和关,灯泡会一明一暗来回变换,这个就是振荡器。而其波形(也叫脉冲)如下图:像右边这样的图形被称为一个振荡器脉冲,一秒钟能产生多少个这样的脉冲,称为这种振荡器的频率。频率稳定的振荡器应用十分广泛,比如安上电池才能走的钟表,所以这种脉冲也叫时钟脉冲,或时钟信号。2.电子管时代如图,正常情况下灯泡不会亮,但当灯丝电源接通后灯泡却亮了;这是因为被
2021-07-31 23:48:17
1133
原创 二.加法机的诞生
为了方便,可以将计算机理解为个盒子,进行输入,运算,输出。一个加法运算部件是这样:a,b端输入加数被加数,O输出结果。那么问题来了:怎么输入?怎么运算?怎么输出?1.怎么输入?首先需要了解二进制数,可以参考我之前的文章,这里附上链接:https://blog.youkuaiyun.com/weixin_50260670/article/details/117599739?spm=1001.2014.3001.5502由于开关的开和关可以表示二进制的0和1,那我们的运算部件就可以造成下图这样:2.怎么输出
2021-07-25 17:44:37
360
原创 七.基于HTTP的功能追加协议
七.基于HTTP的功能追加协议虽然HTTP协议简单便捷,但随着时代发展(各种网站,比如购物网站的出现),其功能已经捉襟见肘。但HTTP已经遍布全球,不能轻易舍弃,所以使用追加协议的方式对其功能进行一些追加:1.消除HTTP瓶颈的SPDY比如csdn上有大量的用户更新内容时,服务器就需要直接将这些内容反馈到各个客户端界面上;这时如果使用HTTP,就需要不断地发送请求报文询问服务器是否有内容更新,如果没有就白白浪费资源;如果有大量更新,HTTP一次也只能发送一条响应且不是强制压缩。这就是一个停打的问题,所
2021-07-25 12:15:21
117
原创 六. HTTPS确保Web安全
六. HTTPS确保Web安全1. HTTP的缺点通信使用明文,内容可能会被盗取;互连网中使用TCP/IP协议族进行通信的过程中会经过非常多的通信载体(网关、路由器等),而这些主机并不可能完全是私人的,所以可能某个环节遭到恶意窥视(抓包)。当然密文也会,只是不会被破解。可以通过加密的方式来规避这个问题:1)通信加密使用HTTP和SSL(安全套接层)组合建立安全通信线路,这被称为HTTPS;2)内容的加密将HTTP报文里的内容进行加密:不验证通信方的身份,可能会遭遇伪装;使用HTT
2021-07-24 23:48:26
476
1
原创 五. HTTP首部
五. HTTP首部HTTP协议的请求和响应报文必定包含首部,是报文中包含信息最丰富的:首部字段可以给对方提供报文主体大小、使用语言、认证信息等内容。基本结构是: 首部字段名 : 字段值,例如: Content - Type : text/html,表示内容类型为text/html文件。注:如果首部中出现相同的字段,不同浏览器会有不同的处理方式,有的会优先处理第一个,而有的浏览器是优先处理第二个。HTTP首部字段类型有四种:通用首部:请求和响应都会用的;请求首部:请求报文中使用,补充了附加内
2021-07-24 10:40:19
282
原创 四. 与HTTP协作的Web服务器
四. 与HTTP协作的Web服务器一台Web服务器可以搭建多个独立域名的Web网站,也可以作为通信时的中转服务器来提升传输的速率。1. 用单台虚拟主机实现多个域名在互联网上,域名通过DNS服务解析成IP地址,通过IP地址找到目的主机;但现在一台主机搭载了多个Web服务器,也就有多个域名,就需要在发送HTTP请求时必须在请求首部HOST指定完整的域名。2. 代理、网关、隧道HTTP通信时,有一些在客户端与服务器之间转发数据的程序。代理相当于中间人的角色,可接受客户端的请求转发给拥有资源的源
2021-07-21 22:42:59
134
原创 三. HTTP状态码
三. HTTP状态码状态码是服务器发送的响应报文中包含的内容,它描述了返回的请求结果。一共包含以下五类: 实际上经常使用的大概就有14种:1. 2XX表示成功200 OK 204 NO Content206 Parial Content2. 3XX表示重定向301 Moved Permanently永久性重定向,表示请求的资源已经被分配其他的URI,以后应该使用新的URI来请求此资源。302 Found临时性重定向,表示请求的资源已经被分配其他的URI,希望本次使
2021-07-21 21:43:26
123
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人