- 博客(49)
- 资源 (6)
- 问答 (1)
- 收藏
- 关注
原创 C++11 packaged_task
std::packaged_task 把一个方法打包成一个task扔到线程中执行,然后通过packaged_task中的furture等待执行结果。
2023-10-20 10:44:35
320
原创 C++11 Forward
模板加std::forword为泛型编程提供了很大的方便,通过模板加std::forword实现一个通用的,可接收不同参数的统一方法调用。std::forword 用来转发函数调用的参数,按原样转发。
2023-10-20 10:39:05
173
原创 C++11 promise 和 future
通过 promise 和 future 可以实现跨线程等待异步操作结果。如在线程2等到线程1的某个执行结果之后线程2才允许往下执行。
2023-10-20 10:19:24
182
原创 C++11线程池
使用 condition_variable::wait(unique_lock&lck, Predicate pred) 时,必须保证条件变量通过唤醒的同时,wait 的第二个参数 Predicate 返回 true 了才可以往下走,必须两个条件同时满足。如果notify的时候Predicate返回时false一样的唤不醒线程。
2023-10-18 16:37:43
219
原创 volatile
在对a和b赋值的过程中,编译器从这段代码看到并没有对flag重新赋值的地方,所以会用赋值给a的flag直接赋值给b,但是多线程情况下,flag可能在其他线程被修改了,所以赋值给b的时候可能是一个不准确的值。还有就是flag如果是通过中断函数修改,或者通过汇编代码修改了,从编译器角度也看不出来,所以编译器的优化会导致拿到不准确的值。告诉编译器这是一个容易被改变的量,每次用的都要到源内存地址去读取,请不要随便优化,不要读缓存,避免优化后读取到的值不是实时的准确值。
2023-10-17 11:05:25
67
原创 constexpr与const的区别
,constexpr 返回的是一个常量表达式,如果改成constexpr int test(int a) { int ret = 1 + 2 + a;},返回的ret是个变量,在return ret之前不能保证ret不会被改变,能被改变说明不是个常量表达式了,所以constexpr修饰的函数只能有一个return语句,并且必须有一个return语句(return语句都没有那就谈不上返回常量表达式了)。b是a的引用,只是说变量b为可读权限,不可修改b,但a仍然是可写的。
2023-10-16 18:26:40
310
原创 QML窗口
Qt Quick 提供了QML API 和 C++ API,也就是这个包里既有QML脚本语言的对象,方法,属性,也有C++语言可以调用的方法,还有QML和C++是交互的机制。Qt::WindowModal :表示该窗口是单个窗口层次结构的模态,会阻止输入到其父窗口、所有祖父窗口以及其父窗口和祖父窗口的所有同级窗口。Qt::FramelessWindowHint:生成无边框窗口。去掉了包括最大化,最小化,关闭的标题栏,并且这时的窗口不可以拖动,不可调整大小,相当于是一个固定死的窗口。
2023-08-13 20:01:16
718
原创 QT框架概要初识
在Qt中,QObject是所有Qt类的基类,是Qt对象模型的核心,只有继承了QObject类的类,才具有信号槽的能力。所以,为了使用信号槽,必须继承QObject。凡是QObject类(不管是直接子类还是间接子类),都应该在第一行代码写上Q_OBJECT。不管是不是使用信号槽,都应该添加这个宏。这个宏的展开将为我们的类提供信号槽机制、国际化机制以及 Qt 提供的不基于 C++ RTTI 的反射能力。
2023-06-21 10:33:03
867
原创 QT安装使用
5.15之后没有离线的exe和run安装包自qt6开始,已经默认禁用了Qt Quick Designer,qt未来将ui图像化重任要交给Qt Design Studio了,目地就是做ui设计的不用安装creator。QT Design 在QTCreator中按钮置灰不能通过按钮打开,需要单独在电脑上启动打开。安装后可以看QT自带的实例 C:\Qt\Examples\Qt-6.5.1\demos。
2023-06-20 17:58:15
240
原创 编解码相关
I帧后面的帧需要参考I帧之前的帧,IDR帧后面的帧不需要参考IDR帧之前的帧;一张w*h的图像,有w*h个像素。在每个关键帧之前发送的头信息,分开两个RTP发过来,可以认为是I帧的一部分,是两个独立的NALU,只有header,没有body,类似的NALU还有分界符NALU,放在PES和ES中间作为PES和ES的分隔点。YUV一个像素一个Y分量,没4个像素一个U分量,没4个像素一个V分量,一个WxH图像的图像,W*H个Y+W*H/4个U+W*H/4个V=3*W*H/2个字节,节省一半的数据量。
2023-05-21 10:59:11
348
原创 查找数组中第k大的数字
快速降序排序查找,每走一趟排序之后通过基准值和k比较,如果k大于基准值的index则到左边找,k小于基准值的index则在右边找,等于的话那就是基准值本身。每次只查找一边,不用像快速排序一样两边都要排序,查找效率比排序效率高一倍。堆排序应该是最直观最快速的。大顶堆建立之后,每次从堆中拿最顶端的最大值,第K个就是第K次拿最大值。可以通过堆排序和快速排序来查找。
2023-05-17 18:26:18
174
原创 文件系统相关
记录的信息主要有:bolck 和 inode的总量,未使用的block和inode的数量,一个block和inode的大小,最近一次挂载的时间,最近一次写入数据的时间,最近一次检验磁盘的时间等其他文件系统的相关信息。,用于Linux的交换分区的文件系统。块的管理节点,相当于块之上更大的索引结构,描述整个分区的文件系统信息,如inode/block的大小、总量、使用量、剩余量,以及文件系统的格式与相关信息。索引表的索引结构称为inode,是"index node"的简称,用来索引,跟踪一个文件的所有块。
2023-05-13 00:48:39
996
原创 fcntl 备忘
若想设置回阻塞,只需要把Flags改为iFlags&~O_NONBLOCK即可。经常用这个fcntl函数改变阻塞和非阻塞性质。F_GETFL(常用)F_SETFL(常用)
2023-05-13 00:47:24
57
原创 文件锁备忘录
/PID of process blocking our lock(F_GETLK only) 当前正加着锁的那个进程的PID,只有当我们获取一个已存在锁的信息时,才会使用这个成员,这个成员的值不是我们设置的,是由文件锁自己设置的,我们只是获取以查看当前那个进程正加着锁。不过一般来说是,对多少内容加锁,就对多少内容解锁,如果你是对整个文件加锁,就将整个文件解锁。F_SETLKW:与F_SETLK一样,只不过设置的是阻塞文件锁,也就说加锁不成功的话就阻塞,是由F_SETLKW宏来决定的。
2023-05-12 09:53:55
80
原创 eventfd 传递事件
Linux 一切皆文件,但这个文件 fd 也是有类型的,文件 fd,socket fd, pipe fd,epollfd,timerfd ,还有一种叫做eventfd的事件 fd 类型,Linux 2.6.22版本引入 ,代码 fs/eventfd.c, 头文件 #include eventfd 不仅可以用于进程间的通信,还能用于用户态和内核态的通信。eventfd 是一个计数相关的fd。计数不为零是有可读事件发生,read之后计数会清零,write则会递增计数器。
2023-05-12 09:51:35
342
原创 socketpair
参数1(domain):表示协议族,在Linux下只能为AF_LOCAL或者AF_UNIX。参数2(type):表示协议,可以是SOCK_STREAM或者SOCK_DGRAM。SOCK_STREAM是基于TCP的,而SOCK_DGRAM是基于UDP的。所创建的套节字对作用是一样的,均能够可读可写(而管道PIPE只能进行单向读或写)。参数4(sv[2]):套节字柄对,该两个句柄作用相同,均能进行读写双向操作。EMFILE: 已经达到了系统限制文件描述符,或者该进程使用过量的描述符。简而言之,该函数是阻塞的。
2023-05-12 09:50:55
136
原创 流媒体相关
起始码之后是每一个NALU的header,H264之所以要定义NALU,是因为NALU的头里面有H264相关的信息,NALU头里面主要带着这个数据单元的类型,如是否IDR、是否SPS、PPS,是否是分块的SLICE ABC,指示是否码流结束,指示这个NALU的重要程度等等。在每个关键帧之前发送的头信息,分开两个RTP发过来,可以认为是I帧的一部分,是两个独立的NALU,只有header,没有body,类似的NALU还有分界符NALU,放在PES和ES中间作为PES和ES的分隔点。
2023-05-12 09:50:50
391
原创 创建型模式设计模式
工厂模式生产的是同一系列的各种产品,有钱了升级为大厂之后,生产不同系列的各种产品。为了解决这些问题,把同一系列的产品作为一个厂,不同系列的那就是不同厂,这样就把厂整合到更高等级上来了。从产品系列这个等级上来扩展符合开闭原则,但从每个小产品上来扩展的时候又需要修改更高系列厂里面的创建函数,违背了开闭原则。简单的说抽象就是把原来的小厂按类型归类聚合为一个大厂,每个大厂里面使用了简单工厂的模式创建这一系列的各种产品。由指挥者统一创建流程,由指挥者统一输出产品,创建过程合创建结果作为指挥者管理的2个部分。
2023-05-12 09:50:29
45
原创 结构型设计模式
目标角色(Target):该角色定义把其他类转换为何种接口,也就是我们的期望接口。源角色(Adaptee):你想把谁转换成目标角色,这个“谁”就是源角色,它是已经存在的、运行良好的类或对象。适配器角色(Adapter):适配器模式的核心角色,其他两个角色都是已经存在的角色,而适配器角色是需要新建立的,它的职责非常简单:通过继承或是类关联的方式把源角色转换为目标角色。通过继承实现的类适配器和通过组合实现的对象适配器,这样通过适配器C在使用A的接口中实际引入了B的功能。
2023-05-12 09:50:15
57
原创 设计模式之设计原则
单一原则:功能单一,不要一堆业务都放在一个实现类中,不要一个函数完成多个功能。单一原则针对的是模块、类的设计,注重职能,是业务逻辑上的划分。针对继承的使用原则,强调基类是为了复用,子类是为了扩展,基类不可随意破坏(不能覆盖),多态要通过面向接口来实现,而不是复写已有实现的基类。依赖倒置:不要高层依赖底层,要倒置过来,最高层定义接口协议,底层按协议实现,高层按协议接口调用,底层按协议接口实现。强调面向接口编程,依赖接口不要依赖实现细节。迪米特:最少知识原则,低调内敛,不要公布太多public方法和静态变量。
2023-05-12 09:49:07
61
原创 行为型设计模式
中介者模式通过中介者对象来封装一系列的对象交互,将对象间复杂的关系网状结构变成结构简单的以中介者为核心的星形结构,对象间一对多的关联转变为一对一的关联,简化对象间的关系,便于理解;更好的扩展性: 由于发起命令的对象和具体的实现完全解耦,因此扩展新的命令就很容易,只需要实现新的命令对象,然后在装配的时候,把具体的实现对象设置到命令对象中,然后就可以使用这个命令对象,已有的实现完全不用变化。调用者(Invoker)角色:要求命令对象执行请求,通常会持有命令对象,可以持有很多的命令对象。
2023-05-12 09:48:48
45
原创 进程管理调度
系统刚刚初始化的时候,current_task都指向init_task,当某个CPU上的进程进行切换的时候,current_task被修改为将要切换到的目标进程,当要获取当前的运行中的task_struct的时候,就需要调用this_cpu_read_stable进行读取,这样如果你是一个进程,正在某个CPU上运行,就能够轻松得到task_struct。线程和进程都是一个task_struct,但线程的 task_struct 不需要额外再分配资源,完全共享进程的,所以线程的资源暂用比进程小。
2023-05-12 09:48:30
148
原创 数据结构相关
对C的兄弟H,H认为C少了一个黑,为了保持平衡,H树也需要减少一个黑,那就只能H变红才能保持H树的平衡。一个节点存储一个数据使得存储效率不高,从而引入B树,2-3树,2-3-4树,使一个节点能存储多个数值。上图,要删除A节点,首先是C树会黑少导致不平衡,要是C树平衡,那就只能D变红。允许一个节点可以有多于两个子节点,同时,也是自平衡的,叶子节点的高度都是相同。变更8的左孩子:临时保持7,8的PL改为6(PPP),6的P为8;7,8自旋:8的PL为7, 7的P为8,7的PL为空;
2023-05-11 10:32:23
87
原创 Mysql 相关记录
对已存在的进行更新,不存在的插入:duplicate key update:insert convert_record (conf_id, time, server_id) values ("1143155680", "20220228133924", "192.168.32.99") on duplicate key update time= if (time>"20220310000001", "20220310000003", "0"),server_id="32.99";阿里:mysql -
2023-05-11 10:22:14
32
原创 UML关系备忘
contain a 的包含关系。整体不存在不影响局部的存在,与组合不同,组合的整体解除时局部也不存在了。成员属性,两者关系对等,只是需要引用到。与组合不同,组合在语义上有has a的整体与局部的关系。如局部变量,函数参数,静态方法等,函数功能执行时存在关联,函数执行完解除。has a 的整体与局部的关系。由整体创建局部,整体结束局部也就消失。图非原创,来源于其他站点,忘记是哪一个站点了,在此只做个查询备忘。作为参数初始化进来的成员属性,生命周期在外部控制。
2023-05-11 10:19:15
45
原创 Nginx相关
我最后是去掉了--add-module=../nginx-rtmp-module-master,只留--add-module=../nginx-http-flv-module-master编译通过然后make install 安装,这样Nginx配置中的 flv_live on 和 rtmp { server{ }} 都可以成功配置(有可能是因为之前单独--add-module=../nginx-rtmp-module-master安装过了rtmp))#必须先创建 /var/log/nginx。
2023-05-11 10:18:52
34
原创 C++内存相关
进来memcheck时需要用到pprof来进行分析, pprof属于工具google-perftools,需要安装google-perftools,然后有 /usr/bin/google-pprof。tcmalloc 在 libgoogle-perftools4库中,安装libgoogle-perftools4库后会有链接 /usr/lib/编译时可能会报警 “libtool: warning: library '/usr/lib/修改 libdir='/usr/local/lib' 即可。
2023-05-11 10:16:14
118
原创 服务架构基本概念
所有业务都集中在一个项目中开发一个服务然后打一个包部署。把单体系统拆分多个子系统,多个子系统分散部署,通过网络调用进行交互来处理系统整体业务。
2023-05-11 10:16:00
348
原创 网络传输相关
如果设计的时候没有第3次握手,那第2次握手失败S端没法知道,S端就会一直保持连接等待接收数据,永远不释放,造成资源泄漏。在链路层,由以太网的物理特性决定了数据帧的长度为(46+18)-(1500+18),其中的18是数据帧的头和尾,也就是说数据帧的内容最大为1500(不包括帧头和帧尾),即MTU(Maximum Transmission Unit)为1500;C端第1次主动挥手请求,S端回复收到请求等待结束,S端完成后续事情之后第3次挥手告诉C端可以结束连接,第4次挥手,S端关闭连接,C端延时关闭连接。
2023-05-11 10:15:42
209
原创 大数据相关
logstash就是一根具备实时数据传输能力的管道,负责将数据信息从管道的输入端传输到管道的输出端;与此同时这根管道还可以让你根据自己的需求在中间加上滤网,Logstash提供里很多功能强大的滤网以满足你的各种应用场景.
2023-05-11 10:15:39
64
原创 CMAKE学习记录
cmake和autotools是makefile的上层工具,它们的目的是为了产生可移植的makefile,并简化自己动手写makefile时的巨大工作量。RPATH、RUNPATH、LD_LIBRARY_PATH三者之间,优先级为RPATH > LD_LIBRARY_PATH > RUNPATH。当RUNPATH存在时,则RPATH失效。RUNPATH不适用于间接依赖的库。使用RUNPATH时,可能需要配合使用LD_LIBRARY_PATH来指定依赖库文件的路径。root@
2023-05-11 10:10:46
185
原创 ubuntu命令备忘
注意,如果函数是库函数或者第三方提供的函数,由于没有源代码,也无法进入函数体。FALSE: lsof -n | grep 6843 |grep -c " 6843 " 包含了并非以fd形式打开的文件,比如用mmap方式访问文件(FD一栏显示为mem),实际并不占用fd。其中包括了像.so这样的文件)(按PID/TID/file的组合对应一行,不是一行一个fd。把文件里的mp4替换成media : sed -i "s/mp4/media/g" ` grep mp4 -rl ./` curl,gdb
2023-05-11 10:09:29
140
原创 内核poll回调和等待队列
poll的本意是调查,在程序里就是检查事件是否发生。f_op→poll() 是文件系统的统一IO检测函数。poll_wait() 函数,把当前进程加入到驱动里自定义的等待队列上,当驱动事件就绪后,就可以在驱动里自定义的等待队列上唤醒调用poll的进程。设置回调函数,一般回调函数func是内核默认函数 default_wake_function,可以自己设置,功能就是唤醒了进程。epoll就利用了队列钩子函数把产生的事件内容copy到rdlist ,这样就不需要我们自己遍历监听句柄们查有谁产生了事件。
2023-05-10 17:49:56
948
原创 IO多路复用相关
通知内核,让内核自动完成TCP三次握手,最后把连接的结果返回给这个函数的返回值。通常,客户端的connect()函数默认会i一直阻塞,直到三次握手成功或超时失败才返回。listen(int sockfd, int backlog)函数是不会阻塞的,其主要做的事,将该sockfd和sockfd对应的连接队列长度告诉linux内核,然后,listen函数结束。,当有一个客户端主动connect(),linux内核就自动完成三次握手,完成之前(SYN_RCVD状态)这个连接一直在。
2023-05-10 17:46:06
121
人机交互技术 多通道用户界面 图形用户界面的设计
2010-06-02
Authorware多媒体创作工具
2010-06-02
win7任务栏的图标创建后,程序启动时的图标没有与创建好的重合
2014-04-25
TA创建的收藏夹 TA关注的收藏夹
TA关注的人