在Delphi下,使用线程向窗体发送动态数组数据的解决方法~
2013-03-23 01:23
501 查看
最近写个小软件,需要在线程内获取json数据,然后将json内的一个items获取出来,存放到数组内,然后再将数组的数据发送到窗体,然后显示出来。
一开始使用的是老方法,创建动态数组,设置长度,然后装载数组数据,使用Sendmessage函数发送,Wparam是Integer(@Array[0])
在窗体,使用了Integer(Array)来接收数组指针,然后读取内容。
但是随后诡异的事情就接二连三出现,不断地报内存错误!!
这让我十分的蛋疼,检查了许久不知道哪里出错,于是我开始怀疑是SendMessage函数的问题。
果然注释掉几个相关代码后,不报错了。
那么,就需要换一个思路来做了。
首先,在窗体上创建动态数组,设置好长度。
然后将动态数组赋值给线程。因为动态数组的赋值其实是指针地址的赋值,也就是类似于对象的引用,所以赋值后两个变量是指向的同一个数组。由于窗体内的数组是全局变量,所以不用担心指针读取错误。
然后在线程内部解析获取到的json,赋值给动态数组,然后向窗体PostMessage一个消息,通知窗体开始接收处理动态数组的数据。
这样一来就不会出现那些指针错误了。
剩余的对于线程和窗体的操作同步,用临界资源、信号量等技术即可实现
一开始使用的是老方法,创建动态数组,设置长度,然后装载数组数据,使用Sendmessage函数发送,Wparam是Integer(@Array[0])
在窗体,使用了Integer(Array)来接收数组指针,然后读取内容。
但是随后诡异的事情就接二连三出现,不断地报内存错误!!
这让我十分的蛋疼,检查了许久不知道哪里出错,于是我开始怀疑是SendMessage函数的问题。
果然注释掉几个相关代码后,不报错了。
那么,就需要换一个思路来做了。
首先,在窗体上创建动态数组,设置好长度。
然后将动态数组赋值给线程。因为动态数组的赋值其实是指针地址的赋值,也就是类似于对象的引用,所以赋值后两个变量是指向的同一个数组。由于窗体内的数组是全局变量,所以不用担心指针读取错误。
然后在线程内部解析获取到的json,赋值给动态数组,然后向窗体PostMessage一个消息,通知窗体开始接收处理动态数组的数据。
这样一来就不会出现那些指针错误了。
剩余的对于线程和窗体的操作同步,用临界资源、信号量等技术即可实现
相关文章推荐
- Python中使用socket发送HTTP请求数据接收不完整问题解决方法
- 问题-Delphi在多线程中使用其他窗体上的控件,报“尚未调用CoInitialize”解决方法
- Python中使用socket发送HTTP请求数据接收不完整问题解决方法
- 使用mobile jQuery 动态给select下拉添加数据,选中项默认不显示的解决方法。
- 使用Mono Cecil 动态获取运行时数据 (Atribute形式 进行注入 用于写Log) [此文报考 xxx is declared in another module and needs to be imported的解决方法]-摘自网络
- VUE中解决不能检测数组中基本数据类型的方法及$set的使用方法
- 使用Django Form解决表单数据无法动态刷新的两种方法
- 使用PostThreadMessage向发送线程消息失败的解决方法
- 在使用 Spring Boot 和 MyBatis 动态切换数据源时遇到的问题以及解决方法
- ExtJs6 发送ajax如何动态改变发送参数的参数名的解决方法
- vc如何自定义消息与在线程中向主窗体控件发送数据
- SQL Server 2008还原数据时报错“因为数据库正在使用,所以无法获得对数据库的独占访问权”的解决方法
- ajax中如何将utf-8编码的数据请求发送到gbk编码应用的解决方法
- JS使用ajax从xml文件动态获取数据显示的方法
- 解决在MySQL使用PetaPoco T4生成数据的实体时得到当前MySQL数据库下所有表的错误方法
- django中使用jquery ajax post数据出现403错误的解决办法(两种方法)
- STM32串口通信中使用printf发送数据配置方法(开发环境 Keil RVMDK)
- jQuery UI Autocomplete 使用 ajax 方法传输Json数据出现乱码问题的解决
- Android之网络----使用HttpClient发送HTTP请求(通过get方法获取数据)
- STM---串口发送数据,第一个数据无法发送的解决方法