<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[甜筒八部 的专栏]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/panjunnn</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; panjunnn]]></copyright><item><title><![CDATA[apt install 报无法修正错误]]></title><link>https://blog.youkuaiyun.com/panjunnn/article/details/125956739</link><guid>https://blog.youkuaiyun.com/panjunnn/article/details/125956739</guid><author>panjunnn</author><pubDate>Sun, 24 Jul 2022 11:21:41 +0800</pubDate><description><![CDATA[E: 无法修正错误，因为您要求某些软件包保持现状，就是它们破坏了软件包间的依赖关系]]></description><category></category></item><item><title><![CDATA[贪心算法笔记]]></title><link>https://blog.youkuaiyun.com/panjunnn/article/details/124523543</link><guid>https://blog.youkuaiyun.com/panjunnn/article/details/124523543</guid><author>panjunnn</author><pubDate>Tue, 03 May 2022 10:50:11 +0800</pubDate><description><![CDATA[思想

贪心算法（Greedy Algorithm）通过一系列的局部最优决策，从而获得问题的全局最优解。

贪心算法的最直接的特点——“贪婪”

思路

把求解的问题分成若干个子问题；
对每个子问题求解，得到子问题的局部最优解；
把子问题的解局部最优解合成原来求解问题的一个解。



贪心算法在对问题求解时，不从整体最优上加以考虑，而是做出在当前看来最好的选择。

贪心算法预设了一个前提，就是认为全局最优解可以由局部最优解推出。

贪心算法将求解过程分成若干个步骤，每个步骤都应用最优原则选择，选取当前最优的]]></description><category></category></item><item><title><![CDATA[Qml 鼠标区域事件传递]]></title><link>https://blog.youkuaiyun.com/panjunnn/article/details/123238115</link><guid>https://blog.youkuaiyun.com/panjunnn/article/details/123238115</guid><author>panjunnn</author><pubDate>Fri, 11 Mar 2022 11:09:48 +0800</pubDate><description><![CDATA[像clicked, doubleClicked， pressAndHold这些称为composed events（组合事件），而press、release则称为basic events（基本事件）。组合事件由基本事件组成。

正常点击事件顺序 ： pressed-&gt;released-&gt;clicked 其中 clicked是组合事件。

pressed等基本事件，只需要在处理程序中写上mouse.accepted=false就会传递下去，

事件处理函数里 写 mouse.accepted = f]]></description><category></category></item><item><title><![CDATA[qt使用矢量图字体ttf作为图标]]></title><link>https://blog.youkuaiyun.com/panjunnn/article/details/122494901</link><guid>https://blog.youkuaiyun.com/panjunnn/article/details/122494901</guid><author>panjunnn</author><pubDate>Sat, 22 Jan 2022 23:23:06 +0800</pubDate><description><![CDATA[TTF（TrueTypeFont）是Apple公司和Microsoft公司共同推出的字体文件格式，是最常用的一种字体文件表示方式。

系统字符集不包含你要用的特殊字体。如甲骨文符号，一般在“系统盘\WINDOWS\Fonts”里，直接双击能查看是什么样的字体。


Font Awesome

我们以Font Awesome（完美的图标字体）为例，讲解如何在程序中使用字体库。

Font Awesome
bootcss-Font Awesome
可以在上面的网站中查看关于Font Awesome的所有介绍-特]]></description><category></category></item><item><title><![CDATA[了解单例模式]]></title><link>https://blog.youkuaiyun.com/panjunnn/article/details/121872385</link><guid>https://blog.youkuaiyun.com/panjunnn/article/details/121872385</guid><author>panjunnn</author><pubDate>Tue, 14 Dec 2021 22:35:30 +0800</pubDate><description><![CDATA[单例模式singleton

单例和多线程，传统的单例模式实现：





class Singleton
{
private:
  Singleton(){}
public:
  static Singleton* instance()
  {
    if(_instance == 0)
    {

//很巧两个线程同时进入该区域，就会创建2次堆对象，
//并且第一次new的堆对象再也控制不住了,要对_instance变量加上互斥锁：
      _in...]]></description><category></category></item><item><title><![CDATA[C++11异步编程]]></title><link>https://blog.youkuaiyun.com/panjunnn/article/details/120959878</link><guid>https://blog.youkuaiyun.com/panjunnn/article/details/120959878</guid><author>panjunnn</author><pubDate>Thu, 04 Nov 2021 11:58:16 +0800</pubDate><description><![CDATA[线程同步是线程间共享数据在访问时的同步。


同步

同步：在调用后没有得到结果，该调用就不返回。一旦调用返回，就意味得到了返回值。由调用者等待调用的结果。

异步

异步：调用后立即返回了，不等待返回结果。由被调用者在得到结果后，通知调用者（回调函数，等）处理这个调用。



异步编程

在线程库&lt; thread &gt;中没有获得线程执行结果的方法


虽然也实现了获取异步任务执行结果的功能，但需要的全局变量较多，多线程间的耦合度较高，编写复杂程序时容易引入bug。有没有更好的方式实现异步编程呢？]]></description><category></category></item><item><title><![CDATA[KCP网络传输协议]]></title><link>https://blog.youkuaiyun.com/panjunnn/article/details/120929988</link><guid>https://blog.youkuaiyun.com/panjunnn/article/details/120929988</guid><author>panjunnn</author><pubDate>Sun, 24 Oct 2021 13:43:39 +0800</pubDate><description><![CDATA[概念

KCP - A Fast and Reliable ARQ Protocol，KCP 快速可靠网络传输协议

KCP力求在保证可靠性的情况下提高传输速度。kcp采取一系列措施尽量提高网络传输速率，在网络实时性和可靠性要求比较高的场景下，可以考虑kcp协议代替tcp协议。

KCP是一种快速可靠协议，KCP以比 TCP浪费10%-20%带宽的代价，换取了平均延迟降低 30%-40%的效果，且最大延迟降低三倍的传输效果。

整个协议只有 ikcp.h, ikcp.c两个源文件，可以方便的集成到用户自己的]]></description><category></category></item><item><title><![CDATA[VC调试程序不能打断点]]></title><link>https://blog.youkuaiyun.com/panjunnn/article/details/120462931</link><guid>https://blog.youkuaiyun.com/panjunnn/article/details/120462931</guid><author>panjunnn</author><pubDate>Fri, 24 Sep 2021 20:52:37 +0800</pubDate><description><![CDATA[这里把调试信息格式设置为无，就打不了断点了
]]></description><category></category></item><item><title><![CDATA[Windows进程间同步方法使用Event]]></title><link>https://blog.youkuaiyun.com/panjunnn/article/details/106742868</link><guid>https://blog.youkuaiyun.com/panjunnn/article/details/106742868</guid><author>panjunnn</author><pubDate>Wed, 22 Sep 2021 14:44:55 +0800</pubDate><description><![CDATA[Event是windows操作系统的一种内核对象，它不但可以用于进程间同步，还可以用于线程间同步。这里介绍的是进程间同步的使用。

在windows所提供的内核对象中，Event内核对象比其他（信号量，互斥量）简单的多，只有是否触发的属性


下面是使用事件内核对象的所要使用的函数接口：

（1）CreateEvent()


HANDLE WINAPI CreateEvent(
 _In_opt_ LPSECURITY_ATTRIBUTES lpEventAttributes,
 _In_  ...]]></description><category></category></item><item><title><![CDATA[window的休眠、睡眠、快速启动]]></title><link>https://blog.youkuaiyun.com/panjunnn/article/details/119543714</link><guid>https://blog.youkuaiyun.com/panjunnn/article/details/119543714</guid><author>panjunnn</author><pubDate>Sun, 19 Sep 2021 23:06:16 +0800</pubDate><description><![CDATA[win10关机后，再次开机，任务管理器中记录的系统运行时间一直在累计

是由于快速启动导致的

GetTickCount64 会做

GetTickCount
GetTickCount是一种函数。GetTickCount返回（retrieve）从操作系统启动所经过（elapsed）的毫秒数，它的返回值是DWORD。
GetTickcount函数：它返回从操作系统启动到当前所经过的毫秒数，常常用来判断某个方法执行的时间，其函数原型是DWORD GetTickCount(void)，返回值以32位的双字类型DW]]></description><category></category></item><item><title><![CDATA[Sqlite索引]]></title><link>https://blog.youkuaiyun.com/panjunnn/article/details/120344165</link><guid>https://blog.youkuaiyun.com/panjunnn/article/details/120344165</guid><author>panjunnn</author><pubDate>Fri, 17 Sep 2021 20:57:59 +0800</pubDate><description><![CDATA[简介

索引（Index）有助于加快 SELECT 查询和 WHERE 子句，但它会减慢使用 UPDATE 和 INSERT 语句时的数据输入。索引可以创建或删除，但不会影响数据。索引是一种特殊的查找表，索引是一个指向表中数据的指针。用来加快数据检索。

除了索引，对查询性能的影响因素还有很多，影响数据库操作的整体性能就需要考虑更多因素，这是一个很大的学问。

聚集索引

表中的行的物理顺序与键值的逻辑（索引）顺序相同。数据的物理顺序只能有一种，所以一张表只能有一个聚集索引。

非聚集索引

表中行...]]></description><category></category></item><item><title><![CDATA[CreateMutex用法]]></title><link>https://blog.youkuaiyun.com/panjunnn/article/details/120335135</link><guid>https://blog.youkuaiyun.com/panjunnn/article/details/120335135</guid><author>panjunnn</author><pubDate>Fri, 17 Sep 2021 10:18:27 +0800</pubDate><description><![CDATA[CreateMutex

CreateMutex（）函数用来创建一个有名或无名的互斥量对象，其函数原型为： 
HANDLE CreateMutex( 
LPSECURITY_ATTRIBUTES lpMutexAttributes,   
BOOL        bInitialOwner,    
LPCTSTR    lpName     
); 


参数

lpMutexAttri...]]></description><category></category></item><item><title><![CDATA[智能指针指向数组]]></title><link>https://blog.youkuaiyun.com/panjunnn/article/details/119519353</link><guid>https://blog.youkuaiyun.com/panjunnn/article/details/119519353</guid><author>panjunnn</author><pubDate>Wed, 01 Sep 2021 20:11:25 +0800</pubDate><description><![CDATA[如果shared_ptr不是指向一个简单的指针，而是指向一个数组：

std::shared_ptr&lt;int&gt; p3(new int[12]);

则在shared_ptr默认的析构函数中，shared_ptr还是会调用delete 函数来删除int数组，而正确的方式是使用 delete []

这种情况下，可以定制析构函数（deleter），将其作为回调传递给shared_ptr的构造函数 。


使用定制deleter创建sharedptr

使用函数指针

在shared_ptr的构...]]></description><category></category></item><item><title><![CDATA[QT管理员权限下拖拽文件进入窗口]]></title><link>https://blog.youkuaiyun.com/panjunnn/article/details/119938711</link><guid>https://blog.youkuaiyun.com/panjunnn/article/details/119938711</guid><author>panjunnn</author><pubDate>Sun, 29 Aug 2021 15:01:56 +0800</pubDate><description><![CDATA[如果qt写的程序，需要拥有管理员权限，又要实现拖拽功能，这种情况该如何处理？





 ::RevokeDragDrop(GetHWnd());
  BOOL b1 = ChangeWindowMessageFilterEx(GetHWnd(), WM_DROPFILES, MSGFLT_ALLOW, NULL);
  BOOL b2 = ChangeWindowMessageFilterEx(GetHWnd(), WM_COPYDATA, MSGFLT_ALLOW, NULL);
  B...]]></description><category></category></item><item><title><![CDATA[获取进程的信息]]></title><link>https://blog.youkuaiyun.com/panjunnn/article/details/119045721</link><guid>https://blog.youkuaiyun.com/panjunnn/article/details/119045721</guid><author>panjunnn</author><pubDate>Sun, 08 Aug 2021 19:28:19 +0800</pubDate><description><![CDATA[使用 NtQueryInformationProcess 函数Retrieves information about the specified process.

Windows NT/2000系统的NTDLL.DLL包含了许多未公开的API函数。

NtQueryInformationProcess就是微软 NTDLL.DLL包含的未公开 的一个 API。


NTDLL.DLL中有一个函数叫NtQueryInformationProcess，用它可以指定参数，获得指定结构体类型的进程信息，拷贝到...]]></description><category></category></item><item><title><![CDATA[QScrollArea类 滚动区域]]></title><link>https://blog.youkuaiyun.com/panjunnn/article/details/118534480</link><guid>https://blog.youkuaiyun.com/panjunnn/article/details/118534480</guid><author>panjunnn</author><pubDate>Fri, 09 Jul 2021 22:07:10 +0800</pubDate><description><![CDATA[QScrollArea

可以使用QScrollArea对象给widget窗口部件添加滚动条。QScrollArea类提供了一个可以滚动的窗口和两个滚动条。这比使用QScrollBar滚动功能要简单。

就是调用QScrollArea对象的setWidget()方法，把需要滚动条的qwidget设置进来。如果这个窗口部件的父对象不是视口，QScrollArea会自动把这个窗口部件的父对象定义为该视口（可以通过QScrollArea::viewPort()来访问），并且让他成为视口的子对象。

IconEdi]]></description><category></category></item><item><title><![CDATA[遍历文件夹下的文件名]]></title><link>https://blog.youkuaiyun.com/panjunnn/article/details/118567854</link><guid>https://blog.youkuaiyun.com/panjunnn/article/details/118567854</guid><author>panjunnn</author><pubDate>Thu, 08 Jul 2021 10:18:11 +0800</pubDate><description><![CDATA[int FindFiles(const QString&amp; fileFullPath ,QStringList &amp; listFullPath )
{
 {
  QFileInfo fileInfoFullPath(fileFullPath);
  if (!fileInfoFullPath.isDir())
  {
   listFullPath.push_back(fileInfoFullPath.filePath());
 ...]]></description><category></category></item><item><title><![CDATA[git rebase]]></title><link>https://blog.youkuaiyun.com/panjunnn/article/details/118109200</link><guid>https://blog.youkuaiyun.com/panjunnn/article/details/118109200</guid><author>panjunnn</author><pubDate>Mon, 28 Jun 2021 11:43:52 +0800</pubDate><description><![CDATA[作用

git rebase用于把一个分支的修改合并到当前分支



git rebase和git merge的区别是什么

本地两个分支：一个分支 dev01 ，一个主分支 master

现在开发分支 dev01要合并来自master 上的最新修改，可以有两种选择 merge 或rebase，

两者的最后得到的结果是一样的，区别是 rebase 后两个分支合并为一个分支，dev01合并前所有的 commit (patch)都 消失了，log历史看起来像没有经过合并一样。

而merge 还是...]]></description><category></category></item><item><title><![CDATA[windows操作系统的Event]]></title><link>https://blog.youkuaiyun.com/panjunnn/article/details/118094198</link><guid>https://blog.youkuaiyun.com/panjunnn/article/details/118094198</guid><author>panjunnn</author><pubDate>Mon, 21 Jun 2021 20:54:04 +0800</pubDate><description><![CDATA[创建事件：

函数原型：

HANDLECreateEvent(

LPSECURITY_ATTRIBUTESlpEventAttributes,    //SD
BOOLbManualReset,//resettype
BOOLbInitialState,...]]></description><category></category></item><item><title><![CDATA[线程不结束进程不退出]]></title><link>https://blog.youkuaiyun.com/panjunnn/article/details/118034987</link><guid>https://blog.youkuaiyun.com/panjunnn/article/details/118034987</guid><author>panjunnn</author><pubDate>Fri, 18 Jun 2021 23:14:21 +0800</pubDate><description><![CDATA[发现程序在退出后而聊天进程没有退出，等待了很长时间也没有退出。

开发人员在调试的时候，已经在debug版本下重现了这个bug，跟踪代码出错部分的流程如下：
发送WM_QUIT消息给一个工作线程让其退出；
用WaitForSingleObject等待那个线程的句柄有信号；
如果有信号，就直接CloseHandle掉这个线程句柄；
如果超时没有信号，就直接用_endthreadex()杀死线程。

开发人员跟踪了好多次发现消息发送过去后线程并没有退出，每次都要超时进入强杀流程，但强杀调用确没有杀死线程，从th]]></description><category></category></item></channel></rss>