<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[tang063的专栏]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/tang063</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; tang063]]></copyright><item><title><![CDATA[C++11 packaged_task]]></title><link>https://blog.youkuaiyun.com/tang063/article/details/133941460</link><guid>https://blog.youkuaiyun.com/tang063/article/details/133941460</guid><author>tang063</author><pubDate>Fri, 20 Oct 2023 10:44:35 +0800</pubDate><description><![CDATA[std::packaged_task 把一个方法打包成一个task扔到线程中执行，然后通过packaged_task中的furture等待执行结果。]]></description><category></category></item><item><title><![CDATA[C++11 Forward]]></title><link>https://blog.youkuaiyun.com/tang063/article/details/133940829</link><guid>https://blog.youkuaiyun.com/tang063/article/details/133940829</guid><author>tang063</author><pubDate>Fri, 20 Oct 2023 10:39:05 +0800</pubDate><description><![CDATA[模板加std::forword为泛型编程提供了很大的方便，通过模板加std::forword实现一个通用的，可接收不同参数的统一方法调用。std::forword 用来转发函数调用的参数，按原样转发。]]></description><category></category></item><item><title><![CDATA[C++11 promise 和 future]]></title><link>https://blog.youkuaiyun.com/tang063/article/details/133940695</link><guid>https://blog.youkuaiyun.com/tang063/article/details/133940695</guid><author>tang063</author><pubDate>Fri, 20 Oct 2023 10:19:24 +0800</pubDate><description><![CDATA[通过 promise 和 future 可以实现跨线程等待异步操作结果。如在线程2等到线程1的某个执行结果之后线程2才允许往下执行。]]></description><category></category></item><item><title><![CDATA[C++11线程池]]></title><link>https://blog.youkuaiyun.com/tang063/article/details/133909023</link><guid>https://blog.youkuaiyun.com/tang063/article/details/133909023</guid><author>tang063</author><pubDate>Wed, 18 Oct 2023 16:37:43 +0800</pubDate><description><![CDATA[使用 condition_variable::wait(unique_lock&lck, Predicate pred) 时，必须保证条件变量通过唤醒的同时，wait 的第二个参数 Predicate 返回 true 了才可以往下走，必须两个条件同时满足。如果notify的时候Predicate返回时false一样的唤不醒线程。]]></description><category></category></item><item><title><![CDATA[volatile]]></title><link>https://blog.youkuaiyun.com/tang063/article/details/133878520</link><guid>https://blog.youkuaiyun.com/tang063/article/details/133878520</guid><author>tang063</author><pubDate>Tue, 17 Oct 2023 11:05:25 +0800</pubDate><description><![CDATA[在对a和b赋值的过程中，编译器从这段代码看到并没有对flag重新赋值的地方，所以会用赋值给a的flag直接赋值给b，但是多线程情况下，flag可能在其他线程被修改了，所以赋值给b的时候可能是一个不准确的值。还有就是flag如果是通过中断函数修改，或者通过汇编代码修改了，从编译器角度也看不出来，所以编译器的优化会导致拿到不准确的值。告诉编译器这是一个容易被改变的量，每次用的都要到源内存地址去读取，请不要随便优化，不要读缓存，避免优化后读取到的值不是实时的准确值。]]></description><category></category></item><item><title><![CDATA[constexpr与const的区别]]></title><link>https://blog.youkuaiyun.com/tang063/article/details/133862073</link><guid>https://blog.youkuaiyun.com/tang063/article/details/133862073</guid><author>tang063</author><pubDate>Mon, 16 Oct 2023 18:26:40 +0800</pubDate><description><![CDATA[，constexpr 返回的是一个常量表达式，如果改成constexpr int test(int a) { int ret = 1 + 2 + a;}，返回的ret是个变量，在return ret之前不能保证ret不会被改变，能被改变说明不是个常量表达式了，所以constexpr修饰的函数只能有一个return语句，并且必须有一个return语句（return语句都没有那就谈不上返回常量表达式了）。b是a的引用，只是说变量b为可读权限，不可修改b，但a仍然是可写的。]]></description><category></category></item><item><title><![CDATA[QML窗口]]></title><link>https://blog.youkuaiyun.com/tang063/article/details/132245997</link><guid>https://blog.youkuaiyun.com/tang063/article/details/132245997</guid><author>tang063</author><pubDate>Sun, 13 Aug 2023 20:01:16 +0800</pubDate><description><![CDATA[Qt Quick 提供了QML API 和 C++ API，也就是这个包里既有QML脚本语言的对象，方法，属性，也有C++语言可以调用的方法，还有QML和C++是交互的机制。Qt::WindowModal ：表示该窗口是单个窗口层次结构的模态，会阻止输入到其父窗口、所有祖父窗口以及其父窗口和祖父窗口的所有同级窗口。Qt::FramelessWindowHint：生成无边框窗口。去掉了包括最大化，最小化，关闭的标题栏，并且这时的窗口不可以拖动，不可调整大小，相当于是一个固定死的窗口。]]></description><category></category></item><item><title><![CDATA[数据库相关]]></title><link>https://blog.youkuaiyun.com/tang063/article/details/131788809</link><guid>https://blog.youkuaiyun.com/tang063/article/details/131788809</guid><author>tang063</author><pubDate>Thu, 20 Jul 2023 17:35:59 +0800</pubDate><description><![CDATA[]]></description><category></category></item><item><title><![CDATA[QT框架概要初识]]></title><link>https://blog.youkuaiyun.com/tang063/article/details/131312972</link><guid>https://blog.youkuaiyun.com/tang063/article/details/131312972</guid><author>tang063</author><pubDate>Wed, 21 Jun 2023 10:33:03 +0800</pubDate><description><![CDATA[在Qt中，QObject是所有Qt类的基类，是Qt对象模型的核心，只有继承了QObject类的类，才具有信号槽的能力。所以，为了使用信号槽，必须继承QObject。凡是QObject类（不管是直接子类还是间接子类），都应该在第一行代码写上Q_OBJECT。不管是不是使用信号槽，都应该添加这个宏。这个宏的展开将为我们的类提供信号槽机制、国际化机制以及 Qt 提供的不基于 C++ RTTI 的反射能力。]]></description><category></category></item><item><title><![CDATA[QT安装使用]]></title><link>https://blog.youkuaiyun.com/tang063/article/details/131027015</link><guid>https://blog.youkuaiyun.com/tang063/article/details/131027015</guid><author>tang063</author><pubDate>Tue, 20 Jun 2023 17:58:15 +0800</pubDate><description><![CDATA[​​​​​​​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。]]></description><category></category></item><item><title><![CDATA[开发环境配置相关]]></title><link>https://blog.youkuaiyun.com/tang063/article/details/131242527</link><guid>https://blog.youkuaiyun.com/tang063/article/details/131242527</guid><author>tang063</author><pubDate>Fri, 16 Jun 2023 10:53:45 +0800</pubDate><description><![CDATA[C/C++ 中的包含只是针对代码的，VC++中的包含是除了代码以为还包括资源引入的包含。]]></description><category></category></item><item><title><![CDATA[编解码相关]]></title><link>https://blog.youkuaiyun.com/tang063/article/details/130789568</link><guid>https://blog.youkuaiyun.com/tang063/article/details/130789568</guid><author>tang063</author><pubDate>Sun, 21 May 2023 10:59:11 +0800</pubDate><description><![CDATA[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个字节，节省一半的数据量。]]></description><category></category></item><item><title><![CDATA[GDB 调试命令]]></title><link>https://blog.youkuaiyun.com/tang063/article/details/130744429</link><guid>https://blog.youkuaiyun.com/tang063/article/details/130744429</guid><author>tang063</author><pubDate>Thu, 18 May 2023 12:32:43 +0800</pubDate><description><![CDATA[GDB调试命令]]></description><category></category></item><item><title><![CDATA[查找数组中第k大的数字]]></title><link>https://blog.youkuaiyun.com/tang063/article/details/130732153</link><guid>https://blog.youkuaiyun.com/tang063/article/details/130732153</guid><author>tang063</author><pubDate>Wed, 17 May 2023 18:26:18 +0800</pubDate><description><![CDATA[快速降序排序查找，每走一趟排序之后通过基准值和k比较，如果k大于基准值的index则到左边找，k小于基准值的index则在右边找，等于的话那就是基准值本身。每次只查找一边，不用像快速排序一样两边都要排序，查找效率比排序效率高一倍。堆排序应该是最直观最快速的。大顶堆建立之后，每次从堆中拿最顶端的最大值，第K个就是第K次拿最大值。可以通过堆排序和快速排序来查找。]]></description><category></category></item><item><title><![CDATA[常见排序算法]]></title><link>https://blog.youkuaiyun.com/tang063/article/details/130709002</link><guid>https://blog.youkuaiyun.com/tang063/article/details/130709002</guid><author>tang063</author><pubDate>Wed, 17 May 2023 15:26:46 +0800</pubDate><description><![CDATA[【代码】常见排序算法。]]></description><category></category></item><item><title><![CDATA[文件系统相关]]></title><link>https://blog.youkuaiyun.com/tang063/article/details/130616480</link><guid>https://blog.youkuaiyun.com/tang063/article/details/130616480</guid><author>tang063</author><pubDate>Sat, 13 May 2023 00:48:39 +0800</pubDate><description><![CDATA[记录的信息主要有：bolck 和 inode的总量，未使用的block和inode的数量，一个block和inode的大小，最近一次挂载的时间，最近一次写入数据的时间，最近一次检验磁盘的时间等其他文件系统的相关信息。，用于Linux的交换分区的文件系统。块的管理节点，相当于块之上更大的索引结构，描述整个分区的文件系统信息，如inode/block的大小、总量、使用量、剩余量，以及文件系统的格式与相关信息。索引表的索引结构称为inode，是"index node"的简称，用来索引，跟踪一个文件的所有块。]]></description><category></category></item><item><title><![CDATA[fcntl 备忘]]></title><link>https://blog.youkuaiyun.com/tang063/article/details/130617013</link><guid>https://blog.youkuaiyun.com/tang063/article/details/130617013</guid><author>tang063</author><pubDate>Sat, 13 May 2023 00:47:24 +0800</pubDate><description><![CDATA[若想设置回阻塞，只需要把Flags改为iFlags&~O_NONBLOCK即可。经常用这个fcntl函数改变阻塞和非阻塞性质。F_GETFL（常用）F_SETFL（常用）]]></description><category></category></item><item><title><![CDATA[二叉排序树]]></title><link>https://blog.youkuaiyun.com/tang063/article/details/130648292</link><guid>https://blog.youkuaiyun.com/tang063/article/details/130648292</guid><author>tang063</author><pubDate>Sat, 13 May 2023 00:43:54 +0800</pubDate><description><![CDATA[【代码】二叉排序树。]]></description><category></category></item><item><title><![CDATA[文件锁备忘录]]></title><link>https://blog.youkuaiyun.com/tang063/article/details/130617126</link><guid>https://blog.youkuaiyun.com/tang063/article/details/130617126</guid><author>tang063</author><pubDate>Fri, 12 May 2023 09:53:55 +0800</pubDate><description><![CDATA[/PID of process blocking our lock(F_GETLK only) 当前正加着锁的那个进程的PID，只有当我们获取一个已存在锁的信息时，才会使用这个成员，这个成员的值不是我们设置的，是由文件锁自己设置的，我们只是获取以查看当前那个进程正加着锁。不过一般来说是，对多少内容加锁，就对多少内容解锁，如果你是对整个文件加锁，就将整个文件解锁。F_SETLKW：与F_SETLK一样，只不过设置的是阻塞文件锁，也就说加锁不成功的话就阻塞，是由F_SETLKW宏来决定的。]]></description><category></category></item><item><title><![CDATA[eventfd 传递事件]]></title><link>https://blog.youkuaiyun.com/tang063/article/details/130616934</link><guid>https://blog.youkuaiyun.com/tang063/article/details/130616934</guid><author>tang063</author><pubDate>Fri, 12 May 2023 09:51:35 +0800</pubDate><description><![CDATA[Linux 一切皆文件，但这个文件 fd 也是有类型的，文件 fd，socket fd， pipe fd，epollfd，timerfd ，还有一种叫做eventfd的事件 fd 类型，Linux 2.6.22版本引入 ，代码 fs/eventfd.c， 头文件 #include eventfd 不仅可以用于进程间的通信，还能用于用户态和内核态的通信。eventfd 是一个计数相关的fd。计数不为零是有可读事件发生，read之后计数会清零，write则会递增计数器。]]></description><category></category></item></channel></rss>