<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[m0_60178310的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/m0_60178310</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; m0_60178310]]></copyright><item><title><![CDATA[Qt TCP简单通信]]></title><link>https://blog.youkuaiyun.com/m0_60178310/article/details/124989566</link><guid>https://blog.youkuaiyun.com/m0_60178310/article/details/124989566</guid><author>m0_60178310</author><pubDate>Tue, 19 Jul 2022 17:14:48 +0800</pubDate><description><![CDATA[Qt实现TCP通信


]]></description><category></category></item><item><title><![CDATA[C++单例模式]]></title><link>https://blog.youkuaiyun.com/m0_60178310/article/details/123808164</link><guid>https://blog.youkuaiyun.com/m0_60178310/article/details/123808164</guid><author>m0_60178310</author><pubDate>Mon, 28 Mar 2022 22:56:52 +0800</pubDate><description><![CDATA[单例：一个类只能创建一个对象

实现步骤：

1.将构造函数声明为类的私有成员 private；

2.通过静态成员函数申请对象空间 ，并返回地址；

3.定义一个静态变量标记，记录对象的个数，该静态成员变量是开关变量，通过控制这个静态标记达到控制只创建一个对象的目的；

4.在析构函数中，将静态变量标记置成1，达到重复利用该静态变量标记目的；

源代码：


#include &lt;iostream&gt;

using namespace std;

// 单例模式，一个类只能创建一个对象
class]]></description><category></category></item><item><title><![CDATA[Qt 多线程实现网络发送文件小功能]]></title><link>https://blog.youkuaiyun.com/m0_60178310/article/details/120530585</link><guid>https://blog.youkuaiyun.com/m0_60178310/article/details/120530585</guid><author>m0_60178310</author><pubDate>Tue, 28 Sep 2021 16:31:09 +0800</pubDate><description><![CDATA[客户端给服务器发送文件，服务器进行接收文件的简单操作

1. 服务器

 1. 创建QTcpServer 类的对象


QTcpServer * server = new QTcpServer(this);

 2. 进行监听


bool QTcpServer::listen(const QHostAddress &amp;address = QHostAddress::Any, quint16 port = 0)

 3. 通过接收 QTcpServer 发出的...]]></description><category></category></item><item><title><![CDATA[Qt 简易版群聊器小功能]]></title><link>https://blog.youkuaiyun.com/m0_60178310/article/details/120436947</link><guid>https://blog.youkuaiyun.com/m0_60178310/article/details/120436947</guid><author>m0_60178310</author><pubDate>Thu, 23 Sep 2021 16:21:05 +0800</pubDate><description><![CDATA[1. 群成员界面设计：





在 signin.cpp 中的构造函数中 创建按钮


// 1. 设置窗口名字、图标

    this-&gt;setWindowTitle("QQ群聊器");

    this-&gt;setWindowIcon(QIcon(":/img/qq_副本.png"));


    // 创建两个容器 分别存放网名 图片名

    QList&lt;QString&gt; nameList;    // 网名列表

    nameList &lt;&lt; "星..]]></description><category></category></item><item><title><![CDATA[Qt 视频播放器]]></title><link>https://blog.youkuaiyun.com/m0_60178310/article/details/120413243</link><guid>https://blog.youkuaiyun.com/m0_60178310/article/details/120413243</guid><author>m0_60178310</author><pubDate>Wed, 22 Sep 2021 15:59:31 +0800</pubDate><description><![CDATA[1. 界面布局：



2. 调用 API 播放视频

加载视频播放模板



在 widget.h 中



widget.cpp 中


// 在构造函数处编写代码
    // 实例化播放视频对象
    this-&gt;player = new QMediaPlayer(this);
    // 实例化播放视频框框
    this-&gt;videoWidget = new QVideoWidget(this);
    // 设置播放视频框框的大小
    this-&gt;video...]]></description><category></category></item><item><title><![CDATA[Qt 制作简易版音乐播放器]]></title><link>https://blog.youkuaiyun.com/m0_60178310/article/details/120392123</link><guid>https://blog.youkuaiyun.com/m0_60178310/article/details/120392123</guid><author>m0_60178310</author><pubDate>Mon, 20 Sep 2021 16:15:05 +0800</pubDate><description><![CDATA[1. 界面设计:



2. 设置背景图片


// 1.重写绘图事件
void Widget::paintEvent(QPaintEvent *event)
{
    // 声明画家
    QPainter painter(this);
    QPixmap pix = QString(":/img/002.jpeg");
    // 设置图片伸缩
    pix.scaled(this-&gt;width(), this-&gt;height());
    // 贴背景图片
    paint]]></description><category></category></item><item><title><![CDATA[两个栈实现一个队列的功能]]></title><link>https://blog.youkuaiyun.com/m0_60178310/article/details/120127024</link><guid>https://blog.youkuaiyun.com/m0_60178310/article/details/120127024</guid><author>m0_60178310</author><pubDate>Mon, 06 Sep 2021 09:44:24 +0800</pubDate><description><![CDATA[1. 栈：

是限制的线性表插入删除必须在同一端完成。

栈的特点：

先进后出：

入栈将数据沉入栈底，最上面的一个数据是栈顶，获取栈顶元素Top，之后要进行Pop 删除栈顶，才可以取到第二个数据。

2. 队列：

也是对线性表的一种限定，规定插入删除数据必须在异端完成。

队列的特点：

 先进先出，存数据的一端叫队尾，出数据的一端叫队头；

入队：存数据； 出队：删除数据

3. 利用两个栈实现一个队列的功能 -- 思路：...]]></description><category></category></item><item><title><![CDATA[平衡二叉树]]></title><link>https://blog.youkuaiyun.com/m0_60178310/article/details/119968289</link><guid>https://blog.youkuaiyun.com/m0_60178310/article/details/119968289</guid><author>m0_60178310</author><pubDate>Sat, 28 Aug 2021 15:13:26 +0800</pubDate><description><![CDATA[4种旋转操作：

1. 左左旋（LL）



2. 左右旋（LR）



3. 右右旋（RR）



4. 右左旋（RL）



创建二叉树实现下图操作：



实现代码：


#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;

// 平衡二叉树，首先是有序二叉树，任意子树的高度差都小于等于1。

// 定义二叉树节点结构体 
typedef struct TreeNode
{
	int data;	// 数据域
	int height;	// 记录...]]></description><category></category></item><item><title><![CDATA[UDP/IP 异步选择模型]]></title><link>https://blog.youkuaiyun.com/m0_60178310/article/details/119931598</link><guid>https://blog.youkuaiyun.com/m0_60178310/article/details/119931598</guid><author>m0_60178310</author><pubDate>Thu, 26 Aug 2021 15:12:37 +0800</pubDate><description><![CDATA[实现步骤：

异步选择模型是基于Windows消息机制的，也就是消息队列，Windows操作系统会为每个窗口创建一个消息队列并且维护

1. 创建窗口：

 创建窗口步骤：

 第一步：创建窗口结构体：


typedef struct tagWNDCLASSEXW {
  UINT      cbSize;
  UINT      style;
  WNDPROC   lpfnWndProc;
  int       cbClsExtra;
  int     ...]]></description><category></category></item><item><title><![CDATA[二叉树遍历]]></title><link>https://blog.youkuaiyun.com/m0_60178310/article/details/119908818</link><guid>https://blog.youkuaiyun.com/m0_60178310/article/details/119908818</guid><author>m0_60178310</author><pubDate>Wed, 25 Aug 2021 12:48:53 +0800</pubDate><description><![CDATA[有二叉树如下图：



实现前序遍历（根左右）： 1 2 4 3 5 7 8 9 6

实现中序遍历（左根右）： 4 2 1 7 5 9 8 3 6

实现后序遍历（左右根）： 4 2 7 9 8 5 6 3 1

实现层...]]></description><category></category></item><item><title><![CDATA[UDP/IP 事件选择模型]]></title><link>https://blog.youkuaiyun.com/m0_60178310/article/details/119885280</link><guid>https://blog.youkuaiyun.com/m0_60178310/article/details/119885280</guid><author>m0_60178310</author><pubDate>Tue, 24 Aug 2021 11:11:16 +0800</pubDate><description><![CDATA[事件选择模型核心：

为每一个socket创建一个事件对象，将socket和对应的事件对象绑定到一起，并投递给操作系统，由操作系统帮我们进行监视，当对应的socket有响应，该对应的事件会被置成有信号，我们获取该信号，进行分类处理。

UDP/IP 事件选择模型：

UDP/IP 是面向非连接的，不可靠的，基于数据报的传输层协议；

对于服务端只有一个socket（服务端socket），直接创建一个事件对象，将该socket和对应的事件对象进行绑定，并投递给系统，之后等待信号，获取信号，之后进行分类处理。
]]></description><category></category></item><item><title><![CDATA[UDP/IP select模型]]></title><link>https://blog.youkuaiyun.com/m0_60178310/article/details/119839989</link><guid>https://blog.youkuaiyun.com/m0_60178310/article/details/119839989</guid><author>m0_60178310</author><pubDate>Sat, 21 Aug 2021 15:20:41 +0800</pubDate><description><![CDATA[select模型服务端代码：

UDP/IP:
    UDP/IP协议的C/S模型不存在傻等的问题，而select模型只是能让recvfrom更灵活一些
     select 代码逻辑：
      1.所有的socket装进一个集合FD_SET UDP只有一个socket即将服务端的socket装进集合中就可以了
      2.通过select函数，检测中的socket集合中...]]></description><category></category></item><item><title><![CDATA[二叉树实现]]></title><link>https://blog.youkuaiyun.com/m0_60178310/article/details/119836601</link><guid>https://blog.youkuaiyun.com/m0_60178310/article/details/119836601</guid><author>m0_60178310</author><pubDate>Sat, 21 Aug 2021 11:05:27 +0800</pubDate><description><![CDATA[中序遍历实现数组元素排序

struct data arr[6] = { 100, "aa", 50, "bb", 40, "cc", 120, "dd", 110, "oo", 130, "qq" };

实现输出：

arr[6] = { 40, "cc", 50, "bb",100, "aa", 110, "oo", 120, "dd", 130, "qq" };

代码：


#define _CRT_SECURE_NO_WARNINGS

#include &lt;stdio.h&gt;
#in.]]></description><category></category></item><item><title><![CDATA[UDP/IP 基本C/S模型]]></title><link>https://blog.youkuaiyun.com/m0_60178310/article/details/119824179</link><guid>https://blog.youkuaiyun.com/m0_60178310/article/details/119824179</guid><author>m0_60178310</author><pubDate>Fri, 20 Aug 2021 15:40:31 +0800</pubDate><description><![CDATA[UDP/IP 与 TCP/IP的区别：

TCP/IP协议的特点：

 面向连接的，可靠的，基于字节流的传输层协议。

UDP/IP协议的特点：

 面向非连接的，不可靠的，基于数据报的传输层协议。

基本C/S模型 

TCP/IP 服务端与客户端是 1对1关系；UDP/IP 服务端与客户端 可以是1对1,1对多 关系。

基本C/S模型中服务端代码：

 UDP/IP:

 是面向非连接的，所以不进行listen、a...]]></description><category></category></item><item><title><![CDATA[二叉树的存与遍历]]></title><link>https://blog.youkuaiyun.com/m0_60178310/article/details/119817322</link><guid>https://blog.youkuaiyun.com/m0_60178310/article/details/119817322</guid><author>m0_60178310</author><pubDate>Fri, 20 Aug 2021 10:18:30 +0800</pubDate><description><![CDATA[实现如下图的中序遍历



利用栈实现中序遍历：

声明二维数组 类型为 struct treeNode* 

定义一个移动的指针节点，记录要遍历的节点

进行入栈、出栈

代码：


#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;

/*
	二叉树：是树形结构的一个重要类型
	二叉树特点：是每个节点最多只能有两颗子树，且有左右之分
	二叉树是n个有限元素的集合，该集合或者为空、或者由一个称为根（root）
		的元素以及两不相交的、被分别称为左子树和.]]></description><category></category></item><item><title><![CDATA[队列 -- 双向循环链表实现]]></title><link>https://blog.youkuaiyun.com/m0_60178310/article/details/119796796</link><guid>https://blog.youkuaiyun.com/m0_60178310/article/details/119796796</guid><author>m0_60178310</author><pubDate>Thu, 19 Aug 2021 10:50:07 +0800</pubDate><description><![CDATA[代码：


#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;stdbool.h&gt;

/*
	队列--双向循环链表实现
		通过对线性表的插入删除操作在异端完成
		比如：
			头插入对应的是尾删除
			尾插入对应的是头删除
		出数据的一端是队头，进数据的是队尾
	栈：	  先进后出
	队列： 先进先出
*/

// 创建双向循环链表节点
struct Node
{
	int a;
	struct Node* pPr.]]></description><category></category></item><item><title><![CDATA[TCP/IP 完成端口]]></title><link>https://blog.youkuaiyun.com/m0_60178310/article/details/119782308</link><guid>https://blog.youkuaiyun.com/m0_60178310/article/details/119782308</guid><author>m0_60178310</author><pubDate>Wed, 18 Aug 2021 16:06:22 +0800</pubDate><description><![CDATA[完成端口是对重叠IO的直接优化

在重叠IO上进行优化：

1.创建完成端口


HANDLE WINAPI CreateIoCompletionPort(
  _In_     HANDLE    FileHandle,				// 填 INVALID_HANDLE_VALUE
  _In_opt_ HANDLE    ExistingCompletionPort,	// 对现有i/o完成端口或空的句柄。 填NULL
  _In_     ULONG_PTR CompletionKey,				// 填0]]></description><category></category></item><item><title><![CDATA[栈--双向循环链表实现]]></title><link>https://blog.youkuaiyun.com/m0_60178310/article/details/119773950</link><guid>https://blog.youkuaiyun.com/m0_60178310/article/details/119773950</guid><author>m0_60178310</author><pubDate>Wed, 18 Aug 2021 10:13:56 +0800</pubDate><description><![CDATA[代码：


#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;stdbool.h&gt;

/*
	栈 用双向循环链表实现栈
	栈：是通过对线性表的插入删除操作在同一端完成（头添加，头删除 或者 尾添加，尾删除）
	栈的特点：
		先进先出
			操作的一端叫栈顶，另一端叫栈底
	栈的功能:
		1.创建栈 stack	
			【C语言就是一个栈指针，相当于链表的头或者尾指针】
		2.判断栈是否为空 isEmpty
			【一.]]></description><category></category></item><item><title><![CDATA[重叠IO之完成例程]]></title><link>https://blog.youkuaiyun.com/m0_60178310/article/details/119675512</link><guid>https://blog.youkuaiyun.com/m0_60178310/article/details/119675512</guid><author>m0_60178310</author><pubDate>Fri, 13 Aug 2021 15:10:15 +0800</pubDate><description><![CDATA[重叠IO事件通知与完成例程的区别：

重叠IO事件通知：需要调用 WSAGetOverlappedResult,获取等到事件的结果，然后根据逻辑，进行分类处理；

重叠IO完成例程：主要是通过处理WSARecv函数的回调函数，和处理WSASend函数的回调函数，不用进行循环去获取等待事件的结果，系统会自动调用回调函数进行处理，完成例程的性能更好

回调函数：


void CALLBACK CompletionROUTINE(
  IN DWORD dwError,                 // 错]]></description><category></category></item><item><title><![CDATA[俄罗斯方块]]></title><link>https://blog.youkuaiyun.com/m0_60178310/article/details/119517229</link><guid>https://blog.youkuaiyun.com/m0_60178310/article/details/119517229</guid><author>m0_60178310</author><pubDate>Thu, 12 Aug 2021 21:59:47 +0800</pubDate><description><![CDATA[俄罗斯方块实现步骤：

1.创建Win32窗口

1.创建窗口结构体


typedef struct tagWNDCLASSEXA {
  UINT      cbSize;
  UINT      style;
  WNDPROC   lpfnWndProc;
  int       cbClsExtra;
  int       cbWndExtra;
  HINSTANCE hInstance;
  HICON     hIcon;
  HCURSOR   hCursor;
  HBRUSH    ]]></description><category></category></item></channel></rss>