<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[jy_1005的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/jy_1005</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; jy_1005]]></copyright><item><title><![CDATA[C#多线程和异步（三）——一些异步编程模式]]></title><link>https://blog.youkuaiyun.com/jy_1005/article/details/130229055</link><guid>https://blog.youkuaiyun.com/jy_1005/article/details/130229055</guid><author>jy_1005</author><pubDate>Tue, 18 Apr 2023 19:16:55 +0800</pubDate><description><![CDATA[现在我们完全可以使用更优秀的其他异步编程模式去替代它。BeginInvoke :执行BeginInvoke方法时，会线程池中获取一个独立线程来执行引用方法，并立即返回一个实现IAsyncResult接口的对象的（该对象包含了线程池中线程运行异步方法的状态），调用线程不阻塞，而引用方法在线程池的线程中并行执行。回调（callback）：原始线程一直执行，无需等待或检查发起的线程是否完成，在发起的线程中的引用方法完成之后，发起线程会调用回调方法，由回调方法在调用EndInvoke之前处理异步方法的结果。]]></description><category></category></item><item><title><![CDATA[C#多线程和异步（二）——Task和async/await详解]]></title><link>https://blog.youkuaiyun.com/jy_1005/article/details/130228834</link><guid>https://blog.youkuaiyun.com/jy_1005/article/details/130228834</guid><author>jy_1005</author><pubDate>Tue, 18 Apr 2023 19:12:43 +0800</pubDate><description><![CDATA[通过上边的介绍，我们知道async/await是基于Task的，而Task是对ThreadPool的封装改进，主要是为了更有效的控制线程池中的线程(ThreadPool中的线程，我们很难通过代码控制其执行顺序，任务延续和取消等等)；当线程池中所有的线程都在忙碌时，又有新任务要处理时，线程池才会新建一个线程来处理该任务，如果线程数量达到设置的最大值，任务会排队，等待其他任务释放线程后再执行。②如果我们想让所有的线程执行完毕(或者任一线程执行完毕)时，立即解除阻塞，使用Join方法不容易实现。]]></description><category></category></item><item><title><![CDATA[C#多线程和异步（一）——基本概念和使用方法]]></title><link>https://blog.youkuaiyun.com/jy_1005/article/details/130228737</link><guid>https://blog.youkuaiyun.com/jy_1005/article/details/130228737</guid><author>jy_1005</author><pubDate>Tue, 18 Apr 2023 19:00:39 +0800</pubDate><description><![CDATA[一个正在运行的应用程序在操作系统中被视为一个进程，包含着一个运行程序所需要的资源，进程可以包括一个或多个线程。进程之间是相对独立的，一个进程无法访问另一个进程的数据（除非利用分布式计算方式），一个进程运行的失败也不会影响其他进程的运行，Windows系统就是利用进程把工作划分为多个独立的区域的。出现该错误的原因是：myTxtBox是由主线程创建的，thread1线程是另外一个线程，在.NET上执行的是托管代码， C#强制要求这些代码必须是线程安全的，即不允许跨线程访问Windows窗体的控件。]]></description><category></category></item><item><title><![CDATA[虚拟串口工具VSPD的使用]]></title><link>https://blog.youkuaiyun.com/jy_1005/article/details/128562740</link><guid>https://blog.youkuaiyun.com/jy_1005/article/details/128562740</guid><author>jy_1005</author><pubDate>Thu, 05 Jan 2023 14:22:07 +0800</pubDate><description><![CDATA[上位机调试串口时，有时是没有硬件设备的，只能虚拟串口，这里简单的讲讲VSPD的使用VSPD是Virtual Serial Port Driver的简写，由著名的软件公司Eltima制作。下载地址：https://www.cr173.com/soft/21406.html。添加完成后，打开2个串口助手，一个打开COM1,一个打开COM2。下载后安装运行，首先添加端口映射，让COM1和COM2形成回环。下载VSPD，这里有个链接，大家也可以自行搜索下载。2个串口助手可以互相通讯了。]]></description><category></category></item><item><title><![CDATA[Windows查看端口占用]]></title><link>https://blog.youkuaiyun.com/jy_1005/article/details/128562628</link><guid>https://blog.youkuaiyun.com/jy_1005/article/details/128562628</guid><author>jy_1005</author><pubDate>Thu, 05 Jan 2023 14:15:47 +0800</pubDate><description><![CDATA[通过命令杀掉进程，或者是直接根据进程的名称杀掉所有的进程，，在命令框中输入如下命令taskkill /f /t /im “进程id或者进程名称”进入windows命令窗口之后，输入命令，输入netstat -ano然后回车，就可以看到系统当前所有的端口使用情况。查看到对应的进程id之后，就可以通过id查找对应的进程名称，使用命令tasklist |findstr “进程id号”杀掉对应的进程id或者是进程名称之后，然后再通过查找命令，查找对应的端口，现在就可以看到这个端口没有被其他应用所占用。]]></description><category></category></item><item><title><![CDATA[QT从入门到入土之常用控件（五）——按钮长按事件分析]]></title><link>https://blog.youkuaiyun.com/jy_1005/article/details/122507417</link><guid>https://blog.youkuaiyun.com/jy_1005/article/details/122507417</guid><author>jy_1005</author><pubDate>Tue, 19 Jul 2022 15:04:11 +0800</pubDate><description><![CDATA[**
引言
**
最近在做qt项目，需要对button按钮添加一个长按事件（比如点击按钮，开始运动。松开按钮，运动停止）。查了些许资料，（差点误把QPushButton的press信号和长按事件混淆）在此记录一下经验。
setAutoRepeat
以前一直以为QPushButton不支持长按，才发现还有这个功能。用起来很简单：
 QPushButton *pBtnSub = new QPushButton(this);
    pBtnSub-&gt;setAutoRepeat(true); //启用长按
]]></description><category></category></item><item><title><![CDATA[c# Invoke 与BeginInvoke 的用法(通俗易懂，最全)]]></title><link>https://blog.youkuaiyun.com/jy_1005/article/details/125872028</link><guid>https://blog.youkuaiyun.com/jy_1005/article/details/125872028</guid><author>jy_1005</author><pubDate>Tue, 19 Jul 2022 14:58:04 +0800</pubDate><description><![CDATA[*c# Invoke 与BeginInvoke 的用法大全]]></description><category></category></item><item><title><![CDATA[C# 多线程Invoke,begininvoke的用法详解]]></title><link>https://blog.youkuaiyun.com/jy_1005/article/details/125679500</link><guid>https://blog.youkuaiyun.com/jy_1005/article/details/125679500</guid><author>jy_1005</author><pubDate>Fri, 08 Jul 2022 15:38:37 +0800</pubDate><description><![CDATA[一直对invoke和begininvoke的使用和概念比较混乱，这两天看了些资料，对这两个的用法和原理有了些新的认识和理解。首先说下，invoke和begininvoke的使用有两种情况：control中的invoke、begininvoke。delegrate中的invoke、begininvoke。这两种情况是不同的，我们这里要讲的是第1种。下面我们在来说下.NET中对invoke和begininvoke的官方定义。control.invoke(参数delegate)方法:在拥有此控件的基础窗口句柄的线]]></description><category></category></item><item><title><![CDATA[VS解决方案、命名空间和项目的关系]]></title><link>https://blog.youkuaiyun.com/jy_1005/article/details/125199012</link><guid>https://blog.youkuaiyun.com/jy_1005/article/details/125199012</guid><author>jy_1005</author><pubDate>Thu, 09 Jun 2022 11:35:50 +0800</pubDate><description><![CDATA[解决方案，命名空间和项目的关系]]></description><category></category></item><item><title><![CDATA[QT从入门到入土（九）——TCP/IP网络通信（以及文件传输）]]></title><link>https://blog.youkuaiyun.com/jy_1005/article/details/122506645</link><guid>https://blog.youkuaiyun.com/jy_1005/article/details/122506645</guid><author>jy_1005</author><pubDate>Sat, 15 Jan 2022 17:45:00 +0800</pubDate><description><![CDATA[**
引言
**
TCP/IP通信（即SOCKET通信）是通过网线将服务器Server端和客户机Client端进行连接，在遵循ISO/OSI模型的四层层级构架的基础上通过TCP/IP协议建立的通讯。控制器可以设置为服务器端或客户端。
关于TCP/IP协议可详看：TCP/IP协议详解 - 知乎 (zhihu.com)
总的来说，TCP/IP通讯有两个部分：
客户端和服务器
QTcpServer（监听套接字）和QTcpSocket（通讯套接字）
监听套接字，顾名思义，监听关于各种通讯的状态，一旦进行通讯，监听套]]></description><category></category></item><item><title><![CDATA[QT从入门到入土（八）——项目打包和发布]]></title><link>https://blog.youkuaiyun.com/jy_1005/article/details/122506579</link><guid>https://blog.youkuaiyun.com/jy_1005/article/details/122506579</guid><author>jy_1005</author><pubDate>Sat, 15 Jan 2022 17:30:00 +0800</pubDate><description><![CDATA[**
引言
**
新手上路可谓是困难重重，你永远不知道下一个困难会在什么时候出现，在完成了运动控制卡封装发布过程中可谓是举步维艰。因此记录一下qt5+vs2019的打包发布方法。
打包整体思路：
将编译后的exe可执行文件及其各种依赖dll、lib、图标、配置文件等先打包放到一个目录中
对其进行打包发布（两种方式）：
利用VS的插件Microsoft Visual Studio Installer Projects安装程序打包插件进行打包
利用Enigma Virtual Box(单文件封装工具) 进行打包]]></description><category></category></item><item><title><![CDATA[QT从入门到入土（七）——鼠标事件]]></title><link>https://blog.youkuaiyun.com/jy_1005/article/details/122506430</link><guid>https://blog.youkuaiyun.com/jy_1005/article/details/122506430</guid><author>jy_1005</author><pubDate>Sat, 15 Jan 2022 17:00:00 +0800</pubDate><description><![CDATA[引言
个人认为，事件机制是Qt最难以理解且最为精妙的一部分。事件主要分为两种：

在与用户交互时发生。比如按下鼠标（mousePressEvent），敲击键盘（keyPressEvent）等。
系统自动发生，比如计时器事件（timerEvent）等。

在发生事件时（比如说上面说的按下鼠标），就会产生一个QEvent对象（这里是QMouseEvent，为QEvent的子类），这个QEvent对象会传给当前组件的event函数。如果当前组件没有安装事件过滤器（这个后面会提到），则会被event函数发放到相应的]]></description><category></category></item><item><title><![CDATA[QT从入门到入土（六）——定时器]]></title><link>https://blog.youkuaiyun.com/jy_1005/article/details/122506389</link><guid>https://blog.youkuaiyun.com/jy_1005/article/details/122506389</guid><author>jy_1005</author><pubDate>Sat, 15 Jan 2022 16:00:00 +0800</pubDate><description><![CDATA[Qt中有两种方法来使用定时器，一种是定时器事件，另一种是使用信号和槽。
常使用信号和槽（代码看起来比较整洁）但是当使用多个定时器的时候最好用定时器事件来处理。
**
定时器方式一：定时器事件
**
需要： #include 
方式：
利用对void timerEvent(QTimerEvent* e)事件的重写。
启动定时器 int QObject::startTimer ( int interval ) ;
开启一个定时器，返回值为int类型。他的参数interval是毫秒级别。当开启成功后会返回这个定时]]></description><category></category></item><item><title><![CDATA[QT从入门到入土（五（2））——多线程(QtConcurrent::run())和线程池]]></title><link>https://blog.youkuaiyun.com/jy_1005/article/details/122506293</link><guid>https://blog.youkuaiyun.com/jy_1005/article/details/122506293</guid><author>jy_1005</author><pubDate>Sat, 15 Jan 2022 15:00:00 +0800</pubDate><description><![CDATA[**
引言
**
在前面对Qt多线程（QThread）做了详细的分析：QT从入门到入土（五（1））——多线程（QThread） - 唯有自己强大 - 博客园 (cnblogs.com)
但是最近在做项目时候，要将一个函数单独运行在另一个线程中，并且这个函数是私有函数，用到的数据也是私有数据，不能通过其他类访问，这样怎么办？如何在Qt中的当前类创建线程？
**
一， 最简单的多线程QtConcurrent::run()
**
其函数原型如下：
QFuture&lt;T&gt; QtConcurrent::ru]]></description><category></category></item><item><title><![CDATA[QT从入门到入土（五（1））——多线程（QThread）]]></title><link>https://blog.youkuaiyun.com/jy_1005/article/details/122506115</link><guid>https://blog.youkuaiyun.com/jy_1005/article/details/122506115</guid><author>jy_1005</author><pubDate>Sat, 15 Jan 2022 14:30:00 +0800</pubDate><description><![CDATA[引言
前面几篇已经对C++的线程做了简单的总结，浅谈C++11中的多线程（三） - 唯有自己强大 - 博客园 (cnblogs.com)。本篇着重于Qt多线程的总结与实现。
跟C++11中很像的是，Qt中使用QThread来管理线程，一个QThread对象管理一个线程，在使用上有很多跟C++11中相似的地方，但更多的是Qt中独有的内容。另外，QThread对象也有消息循环exec()函数，即每个线程都有一个消息循环，用来处理自己这个线程的事件。
一，知识回顾
首先先来回顾一下一些知识点：
1，为什么需要多线]]></description><category></category></item><item><title><![CDATA[QT从入门到入土（四）——文件的读写操作]]></title><link>https://blog.youkuaiyun.com/jy_1005/article/details/122506020</link><guid>https://blog.youkuaiyun.com/jy_1005/article/details/122506020</guid><author>jy_1005</author><pubDate>Sat, 15 Jan 2022 13:45:00 +0800</pubDate><description><![CDATA[引言
文件的读写是很多应用程序具有的功能，甚至某些应用程序就是围绕着某一种格式文件的处理而开发的，所以文件读写是应用程序开发的一个基本功能。
Qt 提供了两种读写纯文本文件的基本方法：
用 QFile 类的 IODevice 读写功能直接进行读写
利用 QFile 和 QTextStream 结合起来，用流（Stream)的方法进行文件读写。
一、文件读操作
（1）使用QFile类
Qt封装了QFile类，方便我们对文件进行操作，可以按照如下的步骤进行：
使用QFile加载文件对象
打开文件 file.op]]></description><category></category></item><item><title><![CDATA[QT从入门到入土之常用控件（一）——菜单栏和对话框]]></title><link>https://blog.youkuaiyun.com/jy_1005/article/details/122506794</link><guid>https://blog.youkuaiyun.com/jy_1005/article/details/122506794</guid><author>jy_1005</author><pubDate>Sat, 15 Jan 2022 10:38:58 +0800</pubDate><description><![CDATA[引言
QMainWindow 是一个为用户提供主窗口程序的类，包含一个菜单栏（menu bar）、多个工具栏(tool bars)、多个锚接部件(dock widgets)、一个状态栏(status bar)及一个中心部件(central widget)，是许多应用程序的基础，如文本编辑器，图片编辑器等。（本篇主要介绍菜单栏和工具栏）

**
一，菜单栏
**
一个主窗口最多只有一个菜单栏。位于主窗口顶部、主窗口标题栏下面。
创建菜单栏。
QMenuBar* menuBar = new QMenuBar(t]]></description><category></category></item><item><title><![CDATA[QT从入门到入土（三）——信号和槽机制]]></title><link>https://blog.youkuaiyun.com/jy_1005/article/details/122505928</link><guid>https://blog.youkuaiyun.com/jy_1005/article/details/122505928</guid><author>jy_1005</author><pubDate>Sat, 15 Jan 2022 09:15:05 +0800</pubDate><description><![CDATA[摘要
信号槽是 Qt 框架引以为豪的机制之一。所谓信号槽，实际就是观察者模式。当某个事件发生之后，比如，按钮检测到自己被点击了一下，它就会发出一个信号 （signal）。这种发出是没有目的的，类似广播。如果有对象对这个信号感兴趣， 它就会使用连接（connect）函数，意思是，将想要处理的信号和自己的一个函 数（称为槽（slot））绑定来处理这个信号。也就是说，当信号发出时，被连接 的槽函数会自动被回调。这就类似观察者模式：当发生了感兴趣的事件，某一个 操作就会被自动触发。（这里提一句，Qt 的信号槽使用了]]></description><category></category></item><item><title><![CDATA[QT从入门到入土（二）——对象模型（对象树）和窗口坐标体系]]></title><link>https://blog.youkuaiyun.com/jy_1005/article/details/122505846</link><guid>https://blog.youkuaiyun.com/jy_1005/article/details/122505846</guid><author>jy_1005</author><pubDate>Sat, 15 Jan 2022 09:00:41 +0800</pubDate><description><![CDATA[摘要
我们使用的标准 C++，其设计的对象模型虽然已经提供了非常高效的 RTTI 支持，但是在某些方面还是不够灵活。比如在 GUI 编程方面，既需要高效的运行效率也需要强大的灵活性，诸如删除某窗口时可不想把子窗口用代码一个个去析构。Qt 将这两者的优点完美的结合在了一起，创造出了特有的对象模型（Qt Object Model）。
一，Qt的基本框架
在上一篇中，我们已经完成了Qt的安装和VS的环境配置。QT从入门到入土（一）——Qt5.14.2安装教程和VS2019环境配置
在讲解对象树之前，我们先来熟悉一]]></description><category></category></item><item><title><![CDATA[QT从入门到入土系列教程（一）——Qt5.14.2安装教程和VS2019环境配置]]></title><link>https://blog.youkuaiyun.com/jy_1005/article/details/122430938</link><guid>https://blog.youkuaiyun.com/jy_1005/article/details/122430938</guid><author>jy_1005</author><pubDate>Tue, 11 Jan 2022 14:03:24 +0800</pubDate><description><![CDATA[引言
24岁的某天，承载着周围人的关心，一路南下。天晴心静，听着斑马，不免对未来有些彷徨。但是呢，人生总要走陌生的路，看陌生的风景，所幸可以听着不变的歌，关心自己的人就那么多。就像是对庸常生活的一次越狱，路才刚刚开始。。。。
                                                                                                                                               ]]></description><category></category></item></channel></rss>