|
|
导航: |
论坛 -> 网络通讯
斑竹:liumazi,sephil |
|
作者: |
|
2019/12/28 8:56:25 |
标题: |
使用IdTCPServer接收数据,画图出错 |
浏览:4291 |
|
加入我的收藏 |
楼主: |
使用IdTCPServer接收大量数据,怎么把数据处理和画图不放在IdTCPServer1Execute(AContext: TIdContext);里面,放在里面chat就出错,单独画图,或者单独接收数据都试过没问题,但是边接收数据,边画图就会报错,内存非法读取。 IdTCPServer 接收到数据,能不能启动一个事件,或者怎么把数据传递给不影响继续。
谢谢!
----------------------------------------------
- |
作者: |
|
2019/12/28 9:49:40 |
1楼: |
多线程操作显示控件必须用同步
----------------------------------------------
简单做人,认真做事。
|
作者: |
|
2019/12/28 13:44:43 |
2楼: |
记得indy的控件execute事件都是在子线程里的。你要把ui的绘制工作放到主线程里去做。
----------------------------------------------
--
|
作者: |
|
2019/12/28 15:58:39 |
3楼: |
bahamut8348,具体怎么做?有没有事例,谢谢!
----------------------------------------------
-
|
作者: |
|
2019/12/28 19:26:33 |
4楼: |
看起来楼主是初学者。
用 DELPHI,要学会面向对象,学会封装,学会降低耦合。
OnExcute 事件,是被 TCP Server 里面的线程驱动的。这里可以获取数据。
至于画图,你需要单独写一个类,把画图的代码写在一个单独的类里面。
然后,最好搞一个用于传输数据的 buffer,也就是装数据的桶,这样的桶,需要多搞几个。也就是需要多个实例。这样的桶,最好也是一个类,在程序中有多个对象实例,轮流用。
因为是多线程的程序,最好不要堵塞 TCP Server 的接收线程,因此,在 OnExcute 里面,把收到的数据,放入一个 Buffer 里面,然后把这个存了数据的对象,丢给画图的对象。
画图的对象在画图的时候,需要是主线程。也就是不能让 OnExcute 直接驱动画图的代码。要么用线程同步,要么发个消息过去触发画图代码。
----------------------------------------------
-
|
作者: |
|
2019/12/29 1:29:45 |
5楼: |
tthread.sync.....()这个就是delphi自己的同步方法,不记得怎么拼了,查查帮助就行了。
说道什么阻塞什么队列,那个不是业务层管的东西,选了indy就不用考虑那么多。直接在收数据的时候处理业务就完事了。 只是要记得凡是涉及到ui层的操作都要同步。
----------------------------------------------
--
|
作者: |
|
2019/12/29 9:29:45 |
6楼: |
pcplayer 确实是懂得不多,delphi是业余爱好,编点小东西自己玩的,一直是皮毛。 有没有相关历程和代码,谢谢!
----------------------------------------------
-
|
作者: |
|
2019/12/29 9:33:13 |
7楼: |
怎么才能让画图在主线程里面呢?
----------------------------------------------
-
|
作者: |
|
2019/12/29 11:49:53 |
8楼: |
简单的做法是在线程里调用Synchronize,参数是一个无参数过程(procedure).
----------------------------------------------
-广袤璀璨的银河,永无止境的梦想(梦无止境游银河) 博客挂了……
|
作者: |
|
2019/12/30 9:43:35 |
9楼: |
5楼说的,直接在接收数据的时候处理业务,这种玩法,练习题可以,写着玩可以。真正的业务,如果数据量大,很可能出问题。最好的办法是先把数据抓出来缓冲,再慢慢处理。
当然,PC 机的资源比较多,不抓出来也能处理。但搞不好会出问题。
很多做嵌入式的程序员,在芯片的数据接收硬中断里面直接处理数据,也运行得好好的。但是,如果数据来得多,速度快,然后业务逻辑的处理某一次刚好就因为某种条件慢了,就出问题。如果是嵌入式,这种程序员是不合格的。但我看到过很多嵌入式程序员这样写代码。
楼主,你自己写一个画图的函数,这个会吧?然后在需要画图的地方,用 TThread.Syn... 你在 TThread 后面打个点,等一下,它会自动出现下来菜单,把它的方法和属性都显示出来,这时候选 Syn.. 的那个方法,这个方法的参数就是你的画图函数,这样就是用主线程调用画图函数了。
记得一个原则:影响界面变化的代码,必须用主线程去执行。比如,Label1.Caption := 'aaa'; 或者 FireMonkey 的 Label1.Text := 'aaa';
----------------------------------------------
-
|
作者: |
|
2019/12/30 18:19:11 |
10楼: |
在业务里面去考虑那么多东西还说什么面向对象,真是呵。 那么一大堆的模型不去用非要在indy里一个控件上折腾,还搞的那么高大上,这种代码无论是可读性还是可维护性都是一坨浆糊。
----------------------------------------------
--
|
作者: |
lngcc (lngcc) |
★☆☆☆☆ |
-
|
普通会员 |
|
2019/12/30 21:33:50 |
11楼: |
@crestxa 试试BMDThread,参考里面的例子,很容易搞定多线程的
----------------------------------------------
-
|
作者: |
lngcc (lngcc) |
★☆☆☆☆ |
-
|
普通会员 |
|
2019/12/30 21:36:01 |
12楼: |
另外,这是BMDThread的Delphi D10.2 Tokyo版本,也附在这里,供参考。
----------------------------------------------
-
|
作者: |
|
2019/12/31 18:32:16 |
13楼: |
奔溃,改为多线程之后还是崩!找不到原因,只要鼠标指向坐标周的下坐标和坐标坐标,都会内存读写出错,能删掉的鼠标动作都已经删除了。teechart的问题?
----------------------------------------------
-
|
作者: |
|
2020/1/1 19:21:11 |
14楼: |
和鼠标有什么关系?你的鼠标动作触发了什么代码?还是和这段代码有关系才对。
----------------------------------------------
-
|
|