- 博客(72)
- 收藏
- 关注
原创 通过位运算快速地进行一些常见的数学运算
左移(<<和右移(>>可以高效地模拟乘法和除法,尤其是对于2的幂次方的操作。位运算不仅能加速常见的数学操作,还能减少计算量,适用于性能要求较高的应用场景,如嵌入式开发、图像处理、网络协议等。加上除数 - 1和右移的结合方法,能够帮助实现向上取整的操作,特别适用于需要分配字节数、内存对齐等场景。通过位运算,许多数学运算可以更高效地执行,尤其在需要处理大量数据时,这种优化能够显著提高程序的性能。
2024-12-05 11:04:50 172
原创 C#几种方式来实现将函数作为参数传递的功能
所以在 C# 中,如果不借助委托、匿名方法或者 Lambda 表达式这些机制(它们从功能实现角度来说等同于其他语言中传递函数的做法),很难实现将一段可灵活替换的逻辑(类似函数功能)作为参数传递给其他函数的操作,因为 C# 本身是依靠这些特性来达成这一灵活编程目的的。委托,其规定了对应的方法要接收两个整数参数并返回一个整数。函数时,直接通过匿名方法创建委托实例,而不需要事先单独定义具名的。方法,增加了代码书写的灵活性,尤其是对于一些简单、临时的逻辑。委托类型的参数,通过传入不同的符合委托要求的方法(也就是。
2024-11-29 14:03:54 383
原创 MFC 分段记录时间log类
在开发大型自动化系统或者多线程应用时,日志记录和时间追踪通常是系统调试和性能优化的关键部分。CAuxiliary类是一个封装了文件日志记录和高精度计时功能的实用工具类,旨在为开发人员提供一种简便的方式,来实现系统运行的日志记录和时间性能分析。本文将详细介绍如何使用CAuxiliary类来记录日志和进行高精度的时间测量。头文件源文件。
2024-11-28 11:30:09 522
原创 C++静态库的创建和使用
1.将生成的.Lib(LibTest.lib)文件和.h(LibTest.h)头文件拷贝到项目工程目录下。新建空项目,编写.h(LibTest.h)和.cpp(LibTest.cpp)文件,如下图。右键项目-》属性-》配置属性-》链接器-》输入-》附件依赖项-》添加LibTest.Lib。右键项目-》属性-》配置属性-》常规-》配置类型-》静态库(.Lib)3.添加头文件 #include“LibTest.h”MFCLibtest.cpp文件。MFCLibtest.h文件。
2024-11-20 16:10:10 227
原创 MFC线程-通过CWinThread派生类实现
Run()(可选):线程执行的核心逻辑,在这里处理线程的实际任务(例如循环计算、后台任务等)。InitInstance():线程初始化方法,执行线程启动时的资源分配和初始化操作。ExitInstance():线程结束时的清理方法,负责释放线程创建时分配的资源。:线程完成任务后,接收到的消息中包含计算结果。主线程显示这个结果,并手动清理线程对象。:通过点击按钮启动线程,并将主窗口句柄传递给线程对象,以便线程能通过消息通知主线程。线程完成任务后,主线程需要接收并处理消息。在主线程的消息映射中,注册并处理。
2024-11-20 13:48:48 377
原创 MFC线程-AfxBeginThread使用方法
一 、AfxBeginThread是 MFC(Microsoft Foundation Classes,微软基础类库)中用于创建一个新线程的函数。它返回一个指向CWinThread类对象的指针,通过这个指针可以对创建出来的线程进行后续的操作和控制。
2024-11-19 10:35:27 488
原创 GIT 使用教程
通过采用合适的 Git 分支管理策略,可以帮助团队更好地组织和管理代码,提高团队的协作能力和生产效率。除了上述常见的分支管理策略,还可以根据团队的具体需求和工作流程定制适合自己的分支管理策略。总之,虽然 SVN 和 Git 都是版本控制系统,但它们的设计和实现方式存在较大差异,开发人员应根据自身需求选择最适合的版本控制系统。当两个分支上的代码修改了同一部分,并且尝试将这两个分支合并时,就会发生代码冲突。•该分支以 main 分支为基线,修复 bug 后,合并到 main 分支部。它是由 Linux 之父。
2024-11-17 17:30:40 653
原创 C++ vector的详细用法和底层原理
vector是STL容器中的一种常用的容器,和数组类似,由于其大小(size)可变,常用于数组大小不可知的情况下来替代数组。vector是为了实现动态数组而产生的容器,然而向量这个名字是STL编写者取名没区好,因为在数学上的向量在几何中是矢量,两者名字相同而意义大相径庭。vector也是一种顺序容器,在内存中连续排列,因此可以通过下标快速访问,时间复杂度为O(1)。然而,连续排列也意味着大小固定,数据超过vector的预定值时vector将自动扩容。//定义一个空的二维vector。
2024-10-25 14:08:41 1025
原创 C++中指针类型、引用类型、值类型
可能会导致程序崩溃或其他不可预期的结果。改进方案1:可以在堆上创建对象,并返回对象的指针。但这需要调用者在适当的时候手动释放内存。
2024-10-24 10:01:59 743
原创 C++ 占位符
格式占位符(%)是在C/C++语言中格式输入函数,如 scanf、printf 等函数中使用。其意义就是起到格式占位的意思,表示在该位置有输入或者输出。占位符就是先占住一个固定的位置,等着你再往里面添加内容的符号,广泛用于计算机中各类文档的编辑。
2024-10-22 14:57:52 519
原创 C#使用Lazy<T>提高性能
单例模式 在这个示例中,的构造函数中有一些输出语句用于表明对象的创建过程。当创建实例时,对象并没有立即被创建。只有在第一次访问时,才会被创建,后续再次访问时,直接返回已经创建好的对象。在这个示例中,通过指定线程安全模式创建实例。然后创建两个(模拟多线程环境),两个都会访问。由于的线程安全机制,即使在多线程环境下,也只会被创建一次。
2024-10-08 11:46:23 480
原创 分享一下C#单例模板类SingletonTemplate<T>
单例模式是一种软件设计模式,旨在确保一个类只有一个实例,并提供一个全局访问点来获取该实例。可以确保实例只在第一次被访问时创建,避免了每次进入锁后都进行实例创建的开销。在内部会处理线程安全问题,无需手动进行双重检查锁定。这段代码实现了一个通用的单例模板类。在多线程环境下,使用。
2024-10-08 11:40:22 418
原创 C#参数数组params的使用方法
如:public static void useParams( int[] list) 和 public static void useParams(params int[] list) 方法参数相同不可重载。如: public static void useParams(int i1,int i2)优于 public static void useParams(params int[] list)第一个先被调用。3.参数类型:“params” 关键字可以与任何类型配合使用,不仅仅局限于整数类型。
2024-09-27 14:56:49 506
原创 Modbus通信主站和从站点区别的理解
主站(Master):主站是通信的发起者,它控制着整个通信过程。它发送请求并等待从站的响应。主站可以是PLC、计算机或其他控制器。它根据需要发起读写操作,并负责处理从站返回的数据。从站(Slave):从站响应主站的请求,它的行为由主站的指令决定。每个从站都有一个唯一的地址,以便主站能准确地定位到它。当从站接收到主站的请求时,它会执行相应的操作,如读取或写入数据,然后将结果返回给主站。通信流程主站发出一个请求,包含目标从站的地址、功能码、数据等信息。从站收到请求后,解析指令并执行相应的操作。
2024-09-03 18:41:57 1480
原创 C#为复杂属性提供下拉式编辑框和弹出式编辑框
弹出式和下拉式是如何实现的呢,这需要为属性提供一个专门的编辑类。.Net为我们提供了一个System.Drawing.Design.UITypeEditor类,它是所有编辑类的基类,从他继承出了诸如ColorEditor、FontEditor的类,因此我们可以在属性框中编辑颜色和字体。定义了这样的类,我们也可以为自己的属性实现弹出式和下拉式编辑方式。 继承者说明:若要实现自定义设计时 UI 类型编辑器,必须执行下列步骤1. 定义一个从 派生的类目的:创建一个新的编辑器类,用于自定义编辑属性值
2024-08-23 11:58:24 587
原创 Winform中DataGridView网格添加ComboBox
3 .编写DataGridView的CurrentCellChanged事件和ComBoBox的SelectedIndexChanged事件。1. 在窗体类中声明一个全局的变量ComBoBox,并在Form的Load事件中设置号ComBoBox的下拉选项。2 .在DataGridView绑定完数据源之后,将ComBoBox添加到DataGridView中。
2024-08-21 10:21:00 353
原创 TCP通信三次握手四次挥手理解
TCP(传输控制协议)是一种面向连接、可靠的数据传输协议,旨在解决在不可靠的互联网上如何确保端到端的可靠数据传输问题。
2024-08-05 14:11:46 901
原创 halcon中XLD
XLD(eXtended Line Descriptions):XDL就是一个轮廓函数,它不是基于像素,人们通常称他为亚像素,只不过它比像素更精确,可以精确到像素内部的一种描述。在Halcon中,
2024-08-02 15:40:03 1212
原创 Halcon学习之derivate_gauss
HALCON 图像处理库中的一个常用算子,用于计算图像的高斯导数。高斯导数是一种平滑导数,在计算过程中结合了高斯滤波,具有平滑噪声的效果。这个算子可以计算图像的不同导数,如梯度、一阶导数、二阶导数、以及 Hessian 行列式等。
2024-07-29 17:16:56 751
原创 Halcon学习之边缘扩展
适合用于图像整体的边缘闭合,不考虑边缘段的长度或具体间隙大小。提供了更精细的控制,允许根据边缘段的长度和最大间隙进行选择性闭合。选择使用哪一个算子取决于具体的应用场景和对边缘连接的要求。
2024-07-29 15:22:53 235
原创 C#Thread详解与示例
C# 多线程编程是提高应用程序性能和响应性的有效方式。通过 Thread 类,您可以创建和启动新的线程,管理线程的生命周期,以及实现线程之间的通信。然而,多线程编程也带来了线程安全的问题,需要通过锁、线程局部变量、Concurrent collections 和 Task 等方式来确保数据的一致性和程序的稳定性。执行耗时的计算或IO操作,如文件处理、数据加密、图像处理等。处理用户界面任务,如后台处理、异步更新UI组件等。实现并行算法,提高计算效率,如矩阵计算、科学模拟等。
2024-07-18 11:38:09 1364
原创 C#各种锁知识点
先上总结:lockMonitor粒度:锁的粒度是指锁定代码块的范围。如果锁定范围太大,会减少并发性,影响性能。尽量减少锁定代码块的大小,只锁定必要的部分。
2024-07-18 11:14:38 1088
原创 c# System.Threading.Timer
下一个Timer对象到期时,线程就会唤醒,在内部调用ThreadPool 的 QueueUserWorkItem,将一个工作项添加到线程池队列中,使你的回调方法得到调用。period 继续使用 Timeout.Infinite. 使用这个方法要注意如果timer 在被Dispose了,使用Change 将会引发异常。使用Dispose方法后,callback还是会执行完一个完整的生命周期,不会中途停止。定时器将会一直执行。如果回调方法的执行时间很长,计时器可能(在上个回调还没有完成的时候)再次触发。
2024-07-18 09:55:58 1499
原创 关于X86、X64及AnyCpu的讨论
在C#和.NET开发中,目标平台配置(X86、X64及Any CPU)决定了应用程序在不同处理器架构上的运行方式。
2024-07-17 11:55:32 822
原创 PFA、PEEK和PP的材质、特点及用途
通过这些特点和用途的比较,可以看出PFA、PEEK和PP在不同领域和应用中的优势和适用性。PFA和PEEK因其高性能和耐化学性,主要用于高要求的工业和技术应用,而PP则因其良好的综合性能和低成本,被广泛用于各种日常和工业应用。
2024-07-17 08:54:01 1018
原创 PLC中的高低字节如何理解?
双字(Double Word,通常是32位整数)的高低字节定义可能会因具体的PLC型号和通信协议而有所不同。通常,双字可以被划分为两个16位字,每个16位字又分为高字节和低字节。
2024-07-16 17:14:19 1027
原创 windows10设置环境变量Path步骤
1、鼠标右键“我的电脑”,点击“属性”,打开控制面板窗口,如图:2、点击“高级系统设置”,弹出设置窗口,如图:3、点击底部的“环境变量”,弹出环境变量窗口,如图:4、在下面的“系统变量”一栏,找到“Path”,并选中它,然后点击“编辑”,弹出编辑窗口,如图:5、在编辑环境变量窗口,点击“新建”,把路径填进去即可6、最后,一路点击“确定”,完成配置
2024-07-10 12:27:23 2990
原创 C#的DllImport使用方法
我们编写的C#代码(也包括.net平台上的其他语言,如VB,J#等),首先经过编译器把代码编译成中间语言(IL),当方法被调用时,公共语言运行库CLR把具体的方法编译成适合本地计算机运行的机器码,并且将编译好的机器码缓存起来,以备下次调用使用。环境的外部,直接编译成目标计算机码,由操作系统直接执行的代码,代码必须自己提供垃圾回收,类型检查,安全支持等服务。指示入口点的调用约定。非托管代码生成的DLL文件,比如使用C++编写的代码编译生成的DLL,不能在VS中直接引用,可以通过DllImport方法来使用。
2024-07-10 12:23:15 1066
原创 C# 一个串口通信的案例实现
Reader:R // 读取失败Reader:R12345678// 读取成功Example:Reader:0A 52 30 31 32 33 34 35 59 54 0D 0A // 成功Reader:0A 52 46 41 49 4C 0D 0A // 失败RPP1R12345678RFAIL。
2024-06-18 14:46:42 518 1
原创 C++关于拷贝构造函数的一些理解
拷贝构造函数通常以引用的方式接受同类型的对象作为参数,以完成对象的拷贝。程序中如果没有定义拷贝构造函数系统会生成一个默认的拷贝构造函数,它会将作为初始值的对象的数据成员的值都拷贝到要初始化的对象中。注意:拷贝构造函数的形参通常建议使用引用类型,如果不使用引用类型,而是传递对象本身,会导致在函数调用时发生对象的拷贝,这样就会调用拷贝构造函数本身,导致无限循环。编译器在执行B=fun2()时会创建一个临时的无名对象,在执行return A 时实际上是调用了拷贝构造函数将A 的值拷贝到。的属性值也被修改了。
2024-06-05 13:25:24 614
原创 C++函数模版和C#的泛型函数的区别
函数模板和C#的泛型函数在概念上是非常相似的,都是用于创建能够处理多种数据类型的通用函数。是类型参数的占位符。而在 C# 中,泛型函数使用。等形式来声明泛型参数。
2024-06-02 17:26:45 471
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人