- 博客(1700)
- 收藏
- 关注
原创 Qt中信号signal的参数是否会在槽中内部被拷贝?
Qt 的参数是否复制,核心看连接类型:Direct 不复制、Queued 一定复制、BlockingQueued 不复制但阻塞。掌握这一点,有助于做出正确的 API 设计与性能权衡,避免隐藏的生命周期问题与不必要的开销。
2025-11-23 11:25:08
66
原创 C#中 WinForm窗口闪烁问题多种解决方法
在 C# WinForm 应用程序中,窗体或控件的闪烁问题通常由频繁的重绘操作、未启用双缓冲、或未优化绘制逻辑导致,以下是解决 C# WinForm 窗口闪烁问题的多种方法,并通过代码讲解的非常详细,需要的朋友可以参考下在 C# WinForm 应用程序中,窗体或控件的闪烁问题通常由频繁的重绘操作、未启用双缓冲、或未优化绘制逻辑导致。
2025-10-19 16:16:50
670
原创 c#中使用socket发送和接受2GB以上的文件
Console.WriteLine($"已发送: {totalSent}/{fileInfo.Length} bytes");Console.WriteLine($"已接收: {totalReceived}/{fileSize} bytes");Console.WriteLine($"接收文件大小: {fileSize} bytes");Console.WriteLine("选择模式: 1-发送方 2-接收方");Console.WriteLine("输入文件路径:");// 发送文件信息头。
2025-09-07 13:47:20
587
原创 C#中调用C++dll时环境的部署
/ 已知double[] binData_R、double[] binData_G、double[] binData_B、int nResult。方式1,通过指针的方式在C#也用double**对应C++ 中的double**采用方式一,直接传入c#中的double[]即可。一、C++函数中的double** 参数。二、C++函数中的double* 参数。//已知doubles。
2025-08-23 13:48:01
728
原创 qt中exe或dll使用windeployqt打包的方法
1.直接在开始菜单找到qt的安装命令窗口(根据编译的类型选择)。然后回车即可自动补全缺少的依赖文件。
2025-08-20 09:55:00
361
原创 Qt中动态库和静态库的创建和使用方法
DEFINES += SHARE_LIBRARY #将SHARE_LIBRARY添加为编译时的预处理器宏,在share_global.h中使用。因为是动态库,没有编译到可执行文件中,所以需要将动态库,部署到可执行文件的能够使用的库路径中,一般放到可执行文件同目录下。我定义的头文件为Share.h、share_global.h,将这两个头文件拷贝到使用库的工程目录中,并添加到工程中。我定义的头文件为Static.h,将这个头文件拷贝到使用库的工程目录中,并添加到工程中。生成执行文件时为:app。
2025-08-19 20:23:25
937
原创 qt中pushButton的Cliked槽不起作用:Object::connectSlotsByName: No matching signal for on_pushButton_clicked()
槽函数命名遵循on_<objectName>_<signal>格式,但UI文件中按钮的objectName并非pushButton。若槽函数带有参数(如on_pushButton_clicked(bool)),但标准clicked()信号无参数,会导致匹配失败。解决方法:手动连接的槽函数应避免on_前缀,例如改为handlePushButtonClick()。手动使用connect()连接信号时,若槽函数仍以on_开头,会触发自动连接尝试。解决方法:清理未使用的槽函数声明和实现。
2025-08-19 20:13:02
344
转载 一文搞懂卷积神经网络(CNN)的原理(超详细)
它们的设计灵感来自于生物学中的视觉系统,旨在模拟人类视觉处理的方式。简而言之,卷积操作就是用一个可移动的小窗口来提取图像中的特征,这个小窗口包含了一组特定的权重,通过与图像的不同位置进行卷积操作,网络能够学习并捕捉到不同特征的信息。上图是只有黑白颜色的灰度图,而更普遍的图片表达方式是RGB颜色模型,即红、绿、蓝三原色的色光以不同的比例相加,以产生多种多样的色光。这张图中蓝色的框就是指一个数据窗口,红色框为卷积核(滤波器),最后得到的绿色方形就是卷积的结果(数据窗口中的数据与卷积核逐个元素相乘再求和)
2025-08-19 20:08:55
627
原创 c++中delete初始化未分配定义的内存会崩溃吗?
在C++中,对未分配的栈内存使用delete操作符会导致未定义行为(UB),这是极其危险的操作。一定会导致未定义行为,通常引发程序崩溃。/**********************在c++中,函数中执行char* sendBuf;⚠️ 关键结论:对未初始化的栈指针执行delete[]是致命错误,崩溃不可避免。/***********************************c++中delete初始化未分配的栈内存。栈和堆内存的根本区别在于管理方式:栈自动回收,堆需手动管理。
2025-07-25 10:36:37
525
原创 c#中获取事件注册的所有方法并执行
3. 在 Main 方法中,创建了 Publisher 、 Subscriber1 和 Subscriber2 的实例,并将 Subscriber1 和 Subscriber2 的事件处理方法注册到 Publisher 的 MyEvent 事件上。在 C# 中,要获取事件注册的所有方法,可以使用 GetInvocationList 方法,该方法在前面介绍委托时提到过,因为事件本质上是基于委托实现的。// 获取事件注册的所有方法。
2025-07-11 09:49:19
381
原创 c#中event和delegate详解
在 Main 方法中, Subscriber 订阅了 Publisher 的 MyEvent 事件,当 Publisher 执行 DoSomething 方法触发事件时, Subscriber 的 HandleEvent 方法就会被调用。它限制了外部代码对事件的操作,只能添加或移除事件处理程序(通过 += 和 -= ),不能直接调用事件(在发布者类外部),这样可以保证事件触发的逻辑由发布者类控制。一个对象(发布者)可以发布事件,其他对象(订阅者)可以注册该事件并在事件触发时执行相应的方法。
2025-07-11 09:41:28
668
原创 c#中获取事件的全部委托并执行
MulticastDelegate 是可以调用多个方法的委托,它是所有委托类型的基类(除了 System.Delegate 之外)。GetInvocationList 方法用于获取一个数组,该数组包含此多路广播委托调用列表中的所有委托。这在你需要遍历委托所关联的所有方法,或者需要单独调用每个方法时非常有用。5. 通过 DynamicInvoke 方法依次调用数组中的每个委托,从而执行每个关联的方法。4. 使用 GetInvocationList 方法获取包含所有关联方法的委托数组。
2025-07-11 09:38:38
514
原创 c#中回调-消息传递和事件委托
/ 类名通常为"Button":ml-citation{ref="6" data="citationList"}/****************************************************************************************************************消息传递。// 订阅事件:ml-citation{ref="7,8" data="citationList"}button.Click -= OnButtonClick;
2025-07-11 09:31:26
555
原创 C#中获取TextBox控件的TextChanged事件所有注册方法
对于匿名方法或lambda表达式,Method.Name会显示编译器生成的名称8。反射方法需要适当的权限,在部分受限制环境中可能无法使用。这些方法只能获取到通过标准+=语法注册的事件处理器。1.使用GetInvocationList方法。2.通过反射获取事件委托字段。3.使用LINQ查询注册方法。
2025-07-11 09:30:40
417
原创 GDI坐标系平移和旋转实例分析
注意:GDI平移或旋转坐标系原点只是改变绘制的原点坐标(默认画布的为最左上角的点),并不改变原始画布的尺寸或位置。//坐标系原点平移+旋转。
2025-06-26 15:41:23
797
原创 qt中的qmap在多线程中能不支持并发读写,需要使用线程同步(容易引起闪退崩溃,需要互斥锁等同步)
1.qt中使用qmap进行多线程并发读写需要使用互斥锁进行同步,可查阅资料使用合适的同步锁或其他同步的方法。
2025-05-20 20:18:23
259
原创 c++中通过new或mallooc数组分配的空间是是否连续?
内存碎片问题:多次调用 new/malloc 分配的多个数组之间地址不连续,因为堆通过链表管理空闲内存,每次分配可能从不同位置获取内存块24。虚拟连续与物理连续:操作系统可能通过分页机制将物理不连续的内存映射为虚拟连续地址,但对开发者透明,逻辑上仍视为连续47。// 分配连续内存块,长度 100*sizeof(int)数据结构特性:数组在逻辑和物理层面均要求连续存储,这是其支持随机访问(如 arr[i])的基础68。// 堆数组,地址连续。// 地址 0x1000。// 栈数组,地址连续。
2025-05-08 17:01:22
512
原创 c++中栈内存和堆内存的分配方法和区别
堆内存 手动分配:通过 new/malloc 等操作显式申请,需匹配 delete/free 释放27 cpp<br>void func() {<br> int* p = new int[100];// 手动释放<br>}2. 动态分配(非标准):使用 alloca 函数调整栈指针6 cpp<br>void func() {<br> int a;// 自动分配<br> int* p = (int*)alloca(100);// 动态分配<br>} // 自动释放<br>
2025-04-25 21:14:50
771
原创 c#中函数执行回调的主要方法
2.通过委托和事件注册,执行窗口或控件之间的回调,也能跨线程函数之间类之间执行回调。1.通过消息传递,必须有窗体或控件的句柄,执行窗口或控件之间的回调。
2025-04-23 09:56:00
289
原创 c#使用gdi绘制一个围绕中心点循环旋转的矩形实例
注意: g.Restore(old);恢复原来的坐标状态需要在g.dispose释放前使用。//下面是GDI矩形旋转的实例。
2025-04-07 14:10:21
316
原创 c#中gdi的平移和旋转
在C#中使用GDI+(Graphics Device Interface)进行坐标系的平移和旋转,可以通过Graphics类的变换方法实现。// 在旋转后的坐标系中平移。// 绕(100,100)旋转30度。// 顺时针旋转45度。// 绕原始原点旋转。先旋转后平移:围绕原始原点旋转后再平移。先平移后旋转:围绕新原点旋转。
2025-04-07 11:53:56
574
原创 C#中SENDMESSAGE和POSTMESSAGE的参数传递使用方法概述
/传递整型参数成功,但是传递参数lp失败,3可以传递成功。//传递整型参数成功,传递参数cds失败,3可以传递成功。//传递2个整型参数成功。///重写窗体的消息处理函数DefWndProc,从中加入自己定义消息的检测的处理入口。IntPtr hWnd, // 信息发往的窗口的句柄。IntPtr hWnd, // 信息发往的窗口的句柄。IntPtr hWnd, // 信息发往的窗口的句柄。IntPtr hWnd, // 信息发往的窗口的句柄。
2025-04-05 10:25:13
1201
原创 C# 安装和使用OpenCVSharp 详解
在本教程中,我们将深入探讨 OpenCVSharp,这是一款将 OpenCV 功能封装为 C# 类库的工具。我们将介绍其安装、基本使用、常见功能,以及实际案例。OpenCVSharp 是 OpenCV 的 C# 封装,允许开发者在 .NET 环境下使用 OpenCV 提供的强大计算机视觉和图像处理功能。在本教程中,我们全面介绍了如何在 C# 中使用 OpenCVSharp 进行计算机视觉和图像处理。输入项目名称,选择目标框架(建议使用 .NET Core 3.1 或 .NET 5),点击“创建”。
2025-04-04 09:48:30
2726
原创 c#中GDI原点坐标平移和旋转详解
c# 图形移动与旋转1 、旋转2、平移3、缩放4、点坐标变换5、选择参数:将此变换参数放在已有的变换矩阵之后还是之前。//----------------旋转和平移的顺序不一样,得到的结果页不一样。6、辅助功能//保存当前绘图板状态//重置//置为此状态通过PrintDocument,将打印页面整体旋转90度,原理如下:先将整体图形,向右偏移到合适的位置.//其中,width为图形宽,x,y为原点坐标.
2025-04-03 22:52:24
925
原创 C# 与opc ua服务器的远程连接概述
OPC是应用于工业通信的,在windows环境的下一种通讯技术,原有的通信技术难以满足日益复杂的环境,在可扩展性,安全性,跨平台性方面的不足日益明显,所以OPC基金会在几年前提出了面向未来的架构设计的OPC 统一架构,简称OPC UA,截止目前为止,越来越多公司将OPC UA作为开放的数据标准,在未来工业4.0行业上也将大放异彩。左边区域可以随便点击看看,可以看到所有公开的数据,比如点击一个数据节点,下面图片中的Name节点,右边编辑框会显示该节点的ID标识,这个标识很重要,关系到等会的读写操作。
2025-03-26 20:06:39
1028
原创 C#中异步编程(async/await)详解
异步这个概念在不同语境下有不同的解释,比如在一个单核CPU里开启两个线程执行两个函数,通常认为这种调用是异步的,但对于CPU来说它是单核不可能同时运行两个函数,不过是由系统调度在不同的时间分片中执行。一般来说,如果两个工作能同时进行,就认为是异步的。在编程中,它通常代表函数的调用可以在不执行完的情况下返回,必要时在完成时回调。有一个概念常常被混淆,多线程和异步。
2025-03-26 20:01:13
3433
原创 通过opcua读取西门子1200/1500plc中DB块的数据(PLC配置)
5、接下来就是最重要的,我从其它地方看到的都无法获取到数据,应该是少了这一步:在OPC UA通信→服务器接口里面新增一个服务器接口,如图五;第二步,点击图中标4的部分,打开OPC UA元素,然后把你想要传输的数据拉倒图中标3的地方;下面着重介绍一下新增的数据,图中标(0)的是第一个对象,对象里面有num1、num2、num3;注意,在计算机里面是从0开始的,即第一个数据的序号应该是0,第二个数据的序号应该是1,# 图五中(1)的数据,这里面的数据没有下一层,所以可以直接获取。
2025-03-26 19:53:13
2603
1
原创 C# 实现与opc ua服务器远程连接
OPC是应用于工业通信的,在windows环境的下一种通讯技术,原有的通信技术难以满足日益复杂的环境,在可扩展性,安全性,跨平台性方面的不足日益明显,所以OPC基金会在几年前提出了面向未来的架构设计的OPC 统一架构,简称OPC UA,截止目前为止,越来越多公司将OPC UA作为开放的数据标准,在未来工业4.0行业上也将大放异彩。左边区域可以随便点击看看,可以看到所有公开的数据,比如点击一个数据节点,下面图片中的Name节点,右边编辑框会显示该节点的ID标识,这个标识很重要,关系到等会的读写操作。
2025-03-26 19:49:01
1547
原创 C++中使用Sanp7 与西门子通过s7协议通信
安装Snap7:从(https://sourceforge.net/projects/snap7/files/1.4.2/)Snap7官网下载并安装Snap7库。根据你的操作系统选择适当的安装包。使用Snap7库可以实现与西门子S7系列PLC的通信。以下是一个基本的C++示例,演示如何使用Snap7库来连接西门子S7 PLC并读取和写入数据。配置开发环境:确保你的C++开发环境能够找到Snap7库和头文件。
2025-02-20 21:37:49
1269
原创 c#中动态窗体注册委托事件需要注意的问题(注册后关闭窗体后事件或委托回调找不到回调对象)
3.c#中如果一个动态窗体创建后,其中的方法被另一个声明的委托类型实例或事件注册(使用+=)了,那么当这个动态窗体关闭后则委托实例或事件中调用时会报错(会提示窗口句句柄未创建不能invoke的问题),这种情境下使用(每次创建新的窗体后使用=)赋值会解决此问题,因为每次动态窗体创建时都会将仅有的被调用即新的窗体的方法赋值给委托实例或事件,被关掉的窗体就不会被调用了(相当于事件注册中的-=操作)。
2025-02-20 21:30:52
227
原创 c#中泛型方法的使用及多约束实例
void foo() where TOne : BaseOne where TTwo : BaseTwo//多个约束。void foo() where T : BaseClass//单个约束。4.多个类型参数约束的C#泛型语法。2.使用到的类型定义。
2024-11-23 15:50:09
735
原创 C++中函数调用机制,返回机制,返回类型及堆栈内存区别详解
堆内存:程序员向操作系统申请一块内存,当系统收到程序的申请时,会遍历一个记录空闲内存地址的链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序。但是,这是不可预测的,并且是不安全的。然而,由于你返回了指向它的指针,你仍然可以通过这个指针访问它的内存位置(尽管这是未定义行为,因为b已经不再是一个有效的对象)。上面的两条return 语句都将返回未定义的值,也就是说,试图使用返回值将引发未定义的行为,对于第一条return语句来说,显然它返回局部对象的引用。
2024-10-24 21:27:12
1160
原创 形参和返回参数的传递概念解析
1.//形参变量是函数进入时在栈上分配的(参数被拷贝到形参变量所在的栈内存上,所以形参改变值只是改变了实际参数的备份并不影响函数外的实际参数;只有传送指针等引用传递的参数才能影响实参变量的值),函数结束后被释放。2.Settings settings = Settings[SelectedIndex];//这是引用传递,settings取的是指针变量里的值,相当于引用传递,指针变量里存的是类对象的地址,指针变量根据系统不同是4个或8个字节空间。/**********************
2024-10-24 21:22:02
1197
转载 c++中堆、栈内存分配详解
堆:首先应该知道操作系统有一个记录空闲内存地址链表,当系统收到程序申请时,会遍历该链表,寻找第一个空间大于所申请空间堆结点,然后将该结点从空闲结点链表中删除,并将该结点空间分配给程序,另外,对于大多数系统,会在这块内存空间中首地址处记录本次分配大小,这样,代码中delete语句才能正确释放本内存空间。同时栈是线程独立的,每个线程都有自己的栈。例子1 ----------------------------------------------------------------------------
2024-10-24 21:11:00
898
原创 函数形参和实参的传递机制及内存分配的理解
形参变量是函数进入时在栈上分配的(参数被拷贝到形参变量所在的栈内存上,所以形参改变值只是改变了实际参数的备份并不影响函数外的实际参数;只有传送指针等引用传递的参数才能影响实参变量的值),函数结束后被释放。
2024-09-15 09:35:48
260
原创 C++和C#在内存处理上的比较
C#与C++内存管理的比较(【出处】http://blog.csdn.net/hardwayboy/article/details/4499242)1、总述C#最大的一个改进其实就是对内存访问与管理方法的改进。在.NET中内存的管理是全权委托给垃圾回收器,由垃圾回收器来决定何时该释放内存空间。现在普遍采用两种技术来释放程序动态申请的系统内存:首先是以C++为代表的必须以手工方式使应用程序代码完成这些工作,让对象维护引用计数。然后是以.NET以及Java使用的垃圾回收器来完成内存释放工作。在C++
2024-09-15 09:32:34
1368
原创 Qt中使用Mysql并发读写
在进行多线程并发读写MySQL数据库之前,需要安装Qt和MySQL数据库,并确保Qt中已经集成了相应的数据库插件。通过将不同的数据库操作放在不同的线程中,可以实现并发读写数据库。/*************************************mysql数据库多线程写入 多线程操作mysql。/***********************************Qt mysql多线程并发读写。/********************************QT数据库连接初始化和删除的方法。
2024-08-18 11:29:29
1407
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅