DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: botbead
今日帖子: 19
在线用户: 22
导航: 论坛 -> 网络通讯 斑竹:liumazi,sephil  
作者:
男 crestxa (crestxa) ▲▲▲▲▲ -
注册会员
2019/12/28 8:56:25
标题:
使用IdTCPServer接收数据,画图出错 浏览:637
加入我的收藏
楼主: 使用IdTCPServer接收大量数据,怎么把数据处理和画图不放在IdTCPServer1Execute(AContext: TIdContext);里面,放在里面chat就出错,单独画图,或者单独接收数据都试过没问题,但是边接收数据,边画图就会报错,内存非法读取。
IdTCPServer 接收到数据,能不能启动一个事件,或者怎么把数据传递给不影响继续。

谢谢!
----------------------------------------------
-
作者:
男 jackalan (nVicen) ★☆☆☆☆ -
盒子活跃会员
2019/12/28 9:49:40
1楼: 多线程操作显示控件必须用同步
----------------------------------------------
简单做人,认真做事。
作者:
男 bahamut8348 (leonna) ★☆☆☆☆ -
普通会员
2019/12/28 13:44:43
2楼: 记得indy的控件execute事件都是在子线程里的。你要把ui的绘制工作放到主线程里去做。
----------------------------------------------
--
作者:
男 crestxa (crestxa) ▲▲▲▲▲ -
注册会员
2019/12/28 15:58:39
3楼: bahamut8348,具体怎么做?有没有事例,谢谢!
----------------------------------------------
-
作者:
男 pcplayer (pcplayer) ★☆☆☆☆ -
普通会员
2019/12/28 19:26:33
4楼: 看起来楼主是初学者。

用 DELPHI,要学会面向对象,学会封装,学会降低耦合。

OnExcute 事件,是被 TCP Server 里面的线程驱动的。这里可以获取数据。

至于画图,你需要单独写一个类,把画图的代码写在一个单独的类里面。

然后,最好搞一个用于传输数据的 buffer,也就是装数据的桶,这样的桶,需要多搞几个。也就是需要多个实例。这样的桶,最好也是一个类,在程序中有多个对象实例,轮流用。

因为是多线程的程序,最好不要堵塞 TCP Server 的接收线程,因此,在 OnExcute 里面,把收到的数据,放入一个 Buffer 里面,然后把这个存了数据的对象,丢给画图的对象。

画图的对象在画图的时候,需要是主线程。也就是不能让 OnExcute 直接驱动画图的代码。要么用线程同步,要么发个消息过去触发画图代码。
----------------------------------------------
-
作者:
男 bahamut8348 (leonna) ★☆☆☆☆ -
普通会员
2019/12/29 1:29:45
5楼: tthread.sync.....()这个就是delphi自己的同步方法,不记得怎么拼了,查查帮助就行了。

说道什么阻塞什么队列,那个不是业务层管的东西,选了indy就不用考虑那么多。直接在收数据的时候处理业务就完事了。
只是要记得凡是涉及到ui层的操作都要同步。
----------------------------------------------
--
作者:
男 crestxa (crestxa) ▲▲▲▲▲ -
注册会员
2019/12/29 9:29:45
6楼: pcplayer 确实是懂得不多,delphi是业余爱好,编点小东西自己玩的,一直是皮毛。
有没有相关历程和代码,谢谢!
----------------------------------------------
-
作者:
男 crestxa (crestxa) ▲▲▲▲▲ -
注册会员
2019/12/29 9:33:13
7楼: 怎么才能让画图在主线程里面呢?
----------------------------------------------
-
作者:
男 iamdream (银河恒久远,梦想无止境!) ★☆☆☆☆ -
大贡献会员
2019/12/29 11:49:53
8楼: 简单的做法是在线程里调用Synchronize,参数是一个无参数过程(procedure).
----------------------------------------------
-广袤璀璨的银河,永无止境的梦想(梦无止境游银河) 博客挂了……
作者:
男 pcplayer (pcplayer) ★☆☆☆☆ -
普通会员
2019/12/30 9:43:35
9楼: 5楼说的,直接在接收数据的时候处理业务,这种玩法,练习题可以,写着玩可以。真正的业务,如果数据量大,很可能出问题。最好的办法是先把数据抓出来缓冲,再慢慢处理。

当然,PC 机的资源比较多,不抓出来也能处理。但搞不好会出问题。

很多做嵌入式的程序员,在芯片的数据接收硬中断里面直接处理数据,也运行得好好的。但是,如果数据来得多,速度快,然后业务逻辑的处理某一次刚好就因为某种条件慢了,就出问题。如果是嵌入式,这种程序员是不合格的。但我看到过很多嵌入式程序员这样写代码。


楼主,你自己写一个画图的函数,这个会吧?然后在需要画图的地方,用 TThread.Syn... 你在 TThread 后面打个点,等一下,它会自动出现下来菜单,把它的方法和属性都显示出来,这时候选 Syn.. 的那个方法,这个方法的参数就是你的画图函数,这样就是用主线程调用画图函数了。

记得一个原则:影响界面变化的代码,必须用主线程去执行。比如,Label1.Caption := 'aaa';  或者 FireMonkey 的 Label1.Text := 'aaa';
----------------------------------------------
-
作者:
男 bahamut8348 (leonna) ★☆☆☆☆ -
普通会员
2019/12/30 18:19:11
10楼: 在业务里面去考虑那么多东西还说什么面向对象,真是呵。
那么一大堆的模型不去用非要在indy里一个控件上折腾,还搞的那么高大上,这种代码无论是可读性还是可维护性都是一坨浆糊。
----------------------------------------------
--
作者:
男 lngcc (lngcc) ▲▲▲▲▲ -
普通会员
2019/12/30 21:33:50
11楼: @crestxa 试试BMDThread,参考里面的例子,很容易搞定多线程的
此帖子包含附件:lngcc_20191230213349.zip 大小:333.7K
----------------------------------------------
-
作者:
男 lngcc (lngcc) ▲▲▲▲▲ -
普通会员
2019/12/30 21:36:01
12楼: 另外,这是BMDThread的Delphi D10.2 Tokyo版本,也附在这里,供参考。
此帖子包含附件:lngcc_2019123021361.zip 大小:73.9K
----------------------------------------------
-
作者:
男 crestxa (crestxa) ▲▲▲▲▲ -
注册会员
2019/12/31 18:32:16
13楼: 奔溃,改为多线程之后还是崩!找不到原因,只要鼠标指向坐标周的下坐标和坐标坐标,都会内存读写出错,能删掉的鼠标动作都已经删除了。teechart的问题?
----------------------------------------------
-
作者:
男 pcplayer (pcplayer) ★☆☆☆☆ -
普通会员
2020/1/1 19:21:11
14楼: 和鼠标有什么关系?你的鼠标动作触发了什么代码?还是和这段代码有关系才对。
----------------------------------------------
-
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v2.1 版权所有 页面执行42.96875毫秒 RSS