- 博客(1685)
- 收藏
- 关注
原创 qt中的qmap在多线程中能不支持并发读写,需要使用线程同步(容易引起闪退崩溃,需要互斥锁等同步)
1.qt中使用qmap进行多线程并发读写需要使用互斥锁进行同步,可查阅资料使用合适的同步锁或其他同步的方法。
2025-05-20 20:18:23
98
原创 c++中通过new或mallooc数组分配的空间是是否连续?
内存碎片问题:多次调用 new/malloc 分配的多个数组之间地址不连续,因为堆通过链表管理空闲内存,每次分配可能从不同位置获取内存块24。虚拟连续与物理连续:操作系统可能通过分页机制将物理不连续的内存映射为虚拟连续地址,但对开发者透明,逻辑上仍视为连续47。// 分配连续内存块,长度 100*sizeof(int)数据结构特性:数组在逻辑和物理层面均要求连续存储,这是其支持随机访问(如 arr[i])的基础68。// 堆数组,地址连续。// 地址 0x1000。// 栈数组,地址连续。
2025-05-08 17:01:22
292
原创 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
600
原创 c#中函数执行回调的主要方法
2.通过委托和事件注册,执行窗口或控件之间的回调,也能跨线程函数之间类之间执行回调。1.通过消息传递,必须有窗体或控件的句柄,执行窗口或控件之间的回调。
2025-04-23 09:56:00
140
原创 c#使用gdi绘制一个围绕中心点循环旋转的矩形实例
注意: g.Restore(old);恢复原来的坐标状态需要在g.dispose释放前使用。//下面是GDI矩形旋转的实例。
2025-04-07 14:10:21
224
原创 c#中gdi的平移和旋转
在C#中使用GDI+(Graphics Device Interface)进行坐标系的平移和旋转,可以通过Graphics类的变换方法实现。// 在旋转后的坐标系中平移。// 绕(100,100)旋转30度。// 顺时针旋转45度。// 绕原始原点旋转。先旋转后平移:围绕原始原点旋转后再平移。先平移后旋转:围绕新原点旋转。
2025-04-07 11:53:56
376
原创 C#中SENDMESSAGE和POSTMESSAGE的参数传递使用方法概述
/传递整型参数成功,但是传递参数lp失败,3可以传递成功。//传递整型参数成功,传递参数cds失败,3可以传递成功。//传递2个整型参数成功。///重写窗体的消息处理函数DefWndProc,从中加入自己定义消息的检测的处理入口。IntPtr hWnd, // 信息发往的窗口的句柄。IntPtr hWnd, // 信息发往的窗口的句柄。IntPtr hWnd, // 信息发往的窗口的句柄。IntPtr hWnd, // 信息发往的窗口的句柄。
2025-04-05 10:25:13
848
原创 C# 安装和使用OpenCVSharp 详解
在本教程中,我们将深入探讨 OpenCVSharp,这是一款将 OpenCV 功能封装为 C# 类库的工具。我们将介绍其安装、基本使用、常见功能,以及实际案例。OpenCVSharp 是 OpenCV 的 C# 封装,允许开发者在 .NET 环境下使用 OpenCV 提供的强大计算机视觉和图像处理功能。在本教程中,我们全面介绍了如何在 C# 中使用 OpenCVSharp 进行计算机视觉和图像处理。输入项目名称,选择目标框架(建议使用 .NET Core 3.1 或 .NET 5),点击“创建”。
2025-04-04 09:48:30
1401
原创 c#中GDI原点坐标平移和旋转详解
c# 图形移动与旋转1 、旋转2、平移3、缩放4、点坐标变换5、选择参数:将此变换参数放在已有的变换矩阵之后还是之前。//----------------旋转和平移的顺序不一样,得到的结果页不一样。6、辅助功能//保存当前绘图板状态//重置//置为此状态通过PrintDocument,将打印页面整体旋转90度,原理如下:先将整体图形,向右偏移到合适的位置.//其中,width为图形宽,x,y为原点坐标.
2025-04-03 22:52:24
667
原创 C# 与opc ua服务器的远程连接概述
OPC是应用于工业通信的,在windows环境的下一种通讯技术,原有的通信技术难以满足日益复杂的环境,在可扩展性,安全性,跨平台性方面的不足日益明显,所以OPC基金会在几年前提出了面向未来的架构设计的OPC 统一架构,简称OPC UA,截止目前为止,越来越多公司将OPC UA作为开放的数据标准,在未来工业4.0行业上也将大放异彩。左边区域可以随便点击看看,可以看到所有公开的数据,比如点击一个数据节点,下面图片中的Name节点,右边编辑框会显示该节点的ID标识,这个标识很重要,关系到等会的读写操作。
2025-03-26 20:06:39
567
原创 C#中异步编程(async/await)详解
异步这个概念在不同语境下有不同的解释,比如在一个单核CPU里开启两个线程执行两个函数,通常认为这种调用是异步的,但对于CPU来说它是单核不可能同时运行两个函数,不过是由系统调度在不同的时间分片中执行。一般来说,如果两个工作能同时进行,就认为是异步的。在编程中,它通常代表函数的调用可以在不执行完的情况下返回,必要时在完成时回调。有一个概念常常被混淆,多线程和异步。
2025-03-26 20:01:13
2122
原创 通过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
791
原创 C# 实现与opc ua服务器远程连接
OPC是应用于工业通信的,在windows环境的下一种通讯技术,原有的通信技术难以满足日益复杂的环境,在可扩展性,安全性,跨平台性方面的不足日益明显,所以OPC基金会在几年前提出了面向未来的架构设计的OPC 统一架构,简称OPC UA,截止目前为止,越来越多公司将OPC UA作为开放的数据标准,在未来工业4.0行业上也将大放异彩。左边区域可以随便点击看看,可以看到所有公开的数据,比如点击一个数据节点,下面图片中的Name节点,右边编辑框会显示该节点的ID标识,这个标识很重要,关系到等会的读写操作。
2025-03-26 19:49:01
945
原创 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
856
原创 c#中动态窗体注册委托事件需要注意的问题(注册后关闭窗体后事件或委托回调找不到回调对象)
3.c#中如果一个动态窗体创建后,其中的方法被另一个声明的委托类型实例或事件注册(使用+=)了,那么当这个动态窗体关闭后则委托实例或事件中调用时会报错(会提示窗口句句柄未创建不能invoke的问题),这种情境下使用(每次创建新的窗体后使用=)赋值会解决此问题,因为每次动态窗体创建时都会将仅有的被调用即新的窗体的方法赋值给委托实例或事件,被关掉的窗体就不会被调用了(相当于事件注册中的-=操作)。
2025-02-20 21:30:52
160
原创 c#中泛型方法的使用及多约束实例
void foo() where TOne : BaseOne where TTwo : BaseTwo//多个约束。void foo() where T : BaseClass//单个约束。4.多个类型参数约束的C#泛型语法。2.使用到的类型定义。
2024-11-23 15:50:09
575
原创 C++中函数调用机制,返回机制,返回类型及堆栈内存区别详解
堆内存:程序员向操作系统申请一块内存,当系统收到程序的申请时,会遍历一个记录空闲内存地址的链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序。但是,这是不可预测的,并且是不安全的。然而,由于你返回了指向它的指针,你仍然可以通过这个指针访问它的内存位置(尽管这是未定义行为,因为b已经不再是一个有效的对象)。上面的两条return 语句都将返回未定义的值,也就是说,试图使用返回值将引发未定义的行为,对于第一条return语句来说,显然它返回局部对象的引用。
2024-10-24 21:27:12
943
原创 形参和返回参数的传递概念解析
1.//形参变量是函数进入时在栈上分配的(参数被拷贝到形参变量所在的栈内存上,所以形参改变值只是改变了实际参数的备份并不影响函数外的实际参数;只有传送指针等引用传递的参数才能影响实参变量的值),函数结束后被释放。2.Settings settings = Settings[SelectedIndex];//这是引用传递,settings取的是指针变量里的值,相当于引用传递,指针变量里存的是类对象的地址,指针变量根据系统不同是4个或8个字节空间。/**********************
2024-10-24 21:22:02
1137
转载 c++中堆、栈内存分配详解
堆:首先应该知道操作系统有一个记录空闲内存地址链表,当系统收到程序申请时,会遍历该链表,寻找第一个空间大于所申请空间堆结点,然后将该结点从空闲结点链表中删除,并将该结点空间分配给程序,另外,对于大多数系统,会在这块内存空间中首地址处记录本次分配大小,这样,代码中delete语句才能正确释放本内存空间。同时栈是线程独立的,每个线程都有自己的栈。例子1 ----------------------------------------------------------------------------
2024-10-24 21:11:00
712
原创 函数形参和实参的传递机制及内存分配的理解
形参变量是函数进入时在栈上分配的(参数被拷贝到形参变量所在的栈内存上,所以形参改变值只是改变了实际参数的备份并不影响函数外的实际参数;只有传送指针等引用传递的参数才能影响实参变量的值),函数结束后被释放。
2024-09-15 09:35:48
191
原创 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
1261
原创 Qt中使用Mysql并发读写
在进行多线程并发读写MySQL数据库之前,需要安装Qt和MySQL数据库,并确保Qt中已经集成了相应的数据库插件。通过将不同的数据库操作放在不同的线程中,可以实现并发读写数据库。/*************************************mysql数据库多线程写入 多线程操作mysql。/***********************************Qt mysql多线程并发读写。/********************************QT数据库连接初始化和删除的方法。
2024-08-18 11:29:29
1233
原创 解决C++开发中的内存碎片问题的几种方式
内存碎片指的是已分配的内存块在使用过程中出现断开的情况,导致可分配的连续内存空间变少,从而影响程序的性能和稳定性。通过使用内存池,可以避免频繁的内存分配和释放,从而减少内存碎片的产生。在C++中,内存碎片是指可用内存空间的分割,它导致即使有足够总量的空闲内存,也可能无法满足较大内存块的分配请求。1.对象池:通过预分配一定数量的对象内存,然后自己管理内存池的分配和释放,可以减少对系统内存的频繁申请和释放。/**************************解释C++中的内存碎片及其影响。
2024-08-18 11:13:41
1307
原创 c++中在堆上创建数组
i == 10 的时候,数组下标范围是0~9,并没有a[10]这个元素,所以程序会导致越界,其结果是未定义的(不确定的)。堆数组,就是指一次性从堆内存分配连续的多个无名变量(也叫元素),这些变量(元素)的地址前后紧挨在一起。下面的代码创建了10个连续存放的无名整型变量(元素),其中第一个变量的地址是a。为了使用这些连续的无名变量(元素),数组使用下标(索引,中括号)来访问这些元素。注意:a[9]是最后一个元素,因为下标是从0,而不是1开始的。注意看第一个元素的下标是0,第10个元素的下标是9。
2024-08-18 11:09:48
340
原创 QT使用Sqlite多线程注意事项
如果没有指定标识,或者使用sqlite3_open()或sqlite3_open16()函数来创建数据库连接,那么在编译时或启动时指定的线程模式将作为默认的线程模式使用。由于sqlite3_threadsafe()函数要早于多线程模式以及启动时和运行时的模式选择,所以它既不能区别多线程模式和串行模式也不能区别启动时和运行时的模式。一般而言,运行时指定的模式将覆盖启动时的指定模式,启动时指定的模式将覆盖编译时指定的模式。如果在编译时或启动时指定为单线程模式,就无法在创建连接时指定多线程或者串行模式。
2024-08-18 10:54:12
625
原创 QML中使用信号槽的几种方法
如果有多个对象使用objectName:"qml_button"同名标记,QObject::findChild返回最后一个标记的QML对象,QObject::findChildren返回所有标记的QML对象存放在QList类型的列表中。在启动QML时,会初始化一个QQmlEngine作为QML引擎,然后使用QQmlComponent对象加载QML文档,QML引擎会提供一个默认的QQmlContext对象作为顶层执行的上下文,用来执行QML文档中定义的函数和表达式。
2024-07-27 21:39:48
1405
转载 计算机系统中程序中断的基本概念 ,中断分类 ,流程详解
排队器的输出是对各个中断信号择优后的一个信号,此时对应一个中断源信号,此时通过中断向量地址形成部件生成中断向量地址,中断向量地址存储的指令可以跳转到中断处理程序的入口地址(中断向量就是中断处理程序的地址)为何要使用中断向量地址的形式,如果中断向量地址形成部件直接生成中断处理程序的地址,那么当中断处理程序的地址改变,那么此时需要修改中断形成部件的电路结构以生成对应的修改后的中断处理程序地址,这样很麻烦。为此,要进行中断排队。关中断使得中断服务程序一气呵成,不会被其他中断打断,直到中断服务程序结束时再开中断。
2024-07-12 20:20:32
4433
1
原创 51单片机的中断系统详解
51系列单片机的中断源包括:两个外部中断源、两个定时器/计数器中断源和一个串行通信口中断源,如果它们向 CPU 发出中断请求信号,CPU 就会产生中断,停止执行当前的程序,转而去执行指定的程序(又称中断服务程序或中断子程序),执行完后又返回来执行原来的程序。将生活事例与单片机中断结合分析,主任务是洗衣服,水开报警是一个中断请求,这一时刻相当于断点处,响应中断去关火,然后将开水灌入暖水瓶中,这一动作实际上是处理中断程序,灌完开水后再回去继续洗衣服,相当于处理完中断程序后再返回主程序继续执行主程序。
2024-07-09 22:20:28
4388
1
原创 单片机系统中的多任务多线程机制的实现详解
另一方面,单片机自从80年代诞生以来,便以飞快的速度发展起来,但由于其物理条件的限制,单片机控制系统的编程仍然局限于经验的模式,很少应用那些新提出的高级语言的编程思想。这对软件的设计有了很高的要求,这同时也是单片机控制系统用软件模拟多线程方法中的难点之一,为了解决这个问题,可在个线程自带线程进度指示器用来标志线程的运行进度,即用一个变量记载线程的每一步。这里我们把每一个启动通道进行测试的程序叫做一个任务,把各自任务下的每一个单独的、分开处理的程序段叫做一个线程,每个线程依靠自己的标识来识别。
2024-07-09 22:07:37
2206
原创 C# 中GDI绘制后不显示问题原因分析与解决,与控件重绘相关的方法区别
系统会在多个不同的时机发送WM_PAINT消息:当第一次创建一个窗口时,当改变窗口的大小时,当把窗口从另一个窗口背后移出时,当最大化或最小化窗口时,等等,这些动作都是由 系统管理的,应用只是被动地接收该消息,在消息处理函数中进行绘制操作;系统会在多个不同的时机发送WM_PAINT消息:当第一次创建一个窗口时,当改变窗口的大小时,当把窗口从另一个窗口背后移出时,当最大化或最小化窗口时,等等,这些动作都是由 系统管理的,应用只是被动地接收该消息,在消息处理函数中进行绘制操作;即在其显示之前画什么都是无用的。
2024-07-06 22:39:10
1077
原创 c#中窗口句柄有关的问题详解
窗口创建时,窗口并没有创建句柄,只有Application.Run(form)或者form.Show()之后才有句柄,即窗口只有显示或者启动消息循环后才有句柄!如果创建form之后Form form = new Form(),主线程中调用form.Handle,如果句柄尚未创建,引用该属性将强制创建句柄,对系统内的逻辑将产生致命的影响。(7)、IsHandleCreated :指示控件是否有与他关联的句柄,如果已经为控件分配了句柄,则为 true;(2)、CreateHandle :为该控件创建句柄,
2024-07-06 22:22:19
926
原创 深入了解UDP 服务器与客户端区别
recvfrom() 函数的返回值是二元组 (bytes, address),其中 bytes 是接收到的 bytes 对象数据,address 是发送方的 IP 地址与端口号,用二元组 (host, port) 表示。可见,UDP 的通信过程比 TCP 简单许多,服务器少了监听与接受连接的过程,而客户端也少了请求连接的过程。type 参数代表套接字的类型,默认值为 SOCK_STREAM,用于 TCP 协议(面向连接)的网络通信,常用的还有 SOCK_DGRAM,用于 UDP 协议(无连接)的网络通信。
2024-07-06 22:17:23
2404
原创 CPU架构及原理
存储单元:包括CPU片内缓存和寄存器组,是CPU中暂时存放数据的地方,里面保存着那些等待处理的数据,或已经处理过的数据,CPU访问寄存器所用的时间要比访问内存的时间短。OK,总结一下,CPU的运行原理就是:控制单元在时序脉冲的作用下,将指令计数器里所指向的指令地址(这个地址是在内存里的)送到地址总线上去,然后CPU将这个地址里的指令读到指令寄存器进行译码。相对控制单元而言,运算器接受控制单元的命令而进行动作,即运算单元所进行的全部操作都是由控制单元发出的控制信号来指挥的,所以它是执行部件。
2024-06-06 22:35:15
771
原创 汇编基础知识-寄存器
IP是专用寄存器,具有自动增量的能力,处理完一条指令,IP的值就加上该指令的字节数,从而指向下一条指令,实现程序的顺序执行。CF(进位标志)、PF(奇偶标志)、AF(调整标志)、ZF(零标志)、SF(符号标志)、OF(溢出标志)(4)没有合适的高级语言或只能采用汇编语言时,如开发最新的处理器程序、暂时没有支持新指令的编译程序。(2)执行:将指令代码翻译成它代表的功能(译码),并发出有关控制信号实现这个功能。(1)原码——最高有效位表示符号(正0负1),其它位直接表示数值大小。bp寄存器默认是SS。
2024-06-01 22:26:59
1638
原创 计算机控制系统之CPU组成及原理(内存寄存器)
而当除数是 16 位时,被除数一定是 32 位的,因为 AX 是 16 位寄存器,自然,放不下 32 位的被除数,所以,在这里还需要使用另一个 16 位寄存器 DX ,其中 DX 存放 32 位的被除数的高 16 位,而 AX 则存放 32 位的被除数的低 16 位,同时,AX 的作用还不仅仅是用来保存被除数的,当除法指令执行完成以后,当然,如果除数是 16 位的话,则 AX 中会保存本次除法操作的商,而 DX 则保存本次除法操作的余数。程序的开始过程和顺序流程是一样的,程序的顺序流程和开始过程相同。
2024-05-30 21:37:31
2943
原创 c及c++基础概念:寄存器、内存、堆栈之间的关系和原理详解
寄存器寄存器是CPU内部用来存放数据的一些小型存储区域,用来暂时存放参与运算的数据和运算结果,包括通用寄存器、专用寄存器和控制寄存器。其实寄存器就是一种常用的时序逻辑电路,但这种时序逻辑电路只包含存储电路。寄存器的存储电路是由锁存器或触发器构成的,因为一个锁存器或触发器能存储1位二进制数,所以由N个锁存器或触发器可以构成N位寄存器。寄存器是中央处理器内的组成部分。寄存器是有限存储容量的高速存储部件,它们可用来暂存指令、数据和位址。寄存器拥有非常高的读写速度,所以在寄存器之间的数据传送非常快。内存
2024-05-30 21:23:46
4071
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人