社区
Delphi
帖子详情
关于线程!
Antiquesoft
2005-11-26 04:20:47
线程在执行一个长时间的操作/循环时使用,如果是收数据的速度很快,保存数据的速度相对慢的话,最主要的不是用几个ADOQuery而是如何将这发来的数据快速接收。你的串口一秒能来多少数据呀!
要不还是开一个缓冲区,将串口来的数据全部先保存到缓冲区中,然后开一个线程,线程时创建一个ADOQuery将缓冲区数据保存。这样你的数据来的在快也没有关系了。
在坛子里看到一位仁兄以上见解,小兄弟尚有不解之处!
能否以一段代码来说明?
...全文
161
6
打赏
收藏
关于线程!
线程在执行一个长时间的操作/循环时使用,如果是收数据的速度很快,保存数据的速度相对慢的话,最主要的不是用几个ADOQuery而是如何将这发来的数据快速接收。你的串口一秒能来多少数据呀! 要不还是开一个缓冲区,将串口来的数据全部先保存到缓冲区中,然后开一个线程,线程时创建一个ADOQuery将缓冲区数据保存。这样你的数据来的在快也没有关系了。 在坛子里看到一位仁兄以上见解,小兄弟尚有不解之处! 能否以一段代码来说明?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
6 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
luxuewei5214
2005-12-08
打赏
举报
回复
不论怎么说,我感觉串口还是个低速I/O,想让他达到nMB/s的速度是不大可能的吧
ZyxIp
2005-12-03
打赏
举报
回复
对于Com口来说是有点夸张。只是举个例子。
固定数组是最好的,刚才也准备说用固定数组,只是用动态数组说明这个问题更简单一些。
固定数组的好处是一次分配好内存以后不用在浪费分配的时间,释放时也更容易。
固定数组的问题在于添加和删除时因为是多个线程,所以有同步的问题,如果用了同步线程的方式则会浪费时间,所以要技巧性的解决。用固定数组实现一个从头开始添加从尾开始删除的队列可以解决要维护两个游标A,B,都初始化为数组最大索引号,收到一条数据将它保存到A位置,然后Inc(A,-1);
保存B位置的数据后Inc(B,-1); 如果A=B则说明缓冲区中没有数据. 游标A<0后如果B=最大索引号则说明缓冲区满了,否则A=最大索引号。
当然将缓冲区的操作要封装成一个对象。可以将它写一个为适合任何大小的结构体。
关于双向队列可以找本《数据结构》来看看。
快乐老猫
2005-12-03
打赏
举报
回复
1.不建议用数组,固定数组浪费空间,数据挪移不方便,需要用独立变量做标志。动态数组的反复开辟也消耗时间,建议用链表方式,如TLIST。
2.楼上的数据采集有点夸张,目前COM口最大的传输速度应该是115Kbps吧,也就是说1秒中最多11K BYTE左右的信息量。
ZyxIp
2005-12-03
打赏
举报
回复
这话就好象是我回复的。
ZyxIp
2005-12-03
打赏
举报
回复
来代码就不用了吧!一时还找不到现成的代码。
如:串口Com_A收到的数据为如是下的结构
TComDataInfo=Record
Name:String[255];
Field1:Integer;
end;
每2毫秒会收到这样的一条数据
要将所有收到的数据保存到表 Table_B 中,如果保存数据的时间为5毫秒.
则可能收到的数据没有保存新的数据就又来了,而且还会造成程序无法操作象死机一样。
所以可以先定义一个数组: ComDataArr:Array of TComDataInfo;
所有收到的数据先保存到这个数组中,所以不会造成数据的丢失。
创建一个线程,总是在检查ComDataArr数组的长度发现有数据就保存到Table_B中。也就不会造成程序无法操作。
当然如果收数据的速度比较慢,直接保存就可以了。
如果数据来的更快,如网络游戏中服务器端的程序,因为同时有非常多的玩家发消息上来,就要用端口映射的方式,让系统帮你直接将收到的数据放到你所开辟的的内存中比上面的方式省了复制的时间。
当然也有可能缓冲区会满,所以要合理定义缓冲区,添加内存或者给发数据的一方通知让暂停发送。
这些都是要根据收取数据的速度处理的速度来选择用什么样的方法。
hmzgz81
2005-11-27
打赏
举报
回复
开缓冲区,如果你的存数据的速度一直很满的话,那是不是你的缓冲区的越来越大,会不会导致溢出,或数据丢失.
下载 多
线程
编程技术开发资料 高清完整PDF版
多
线程
编程技术开发资料.pdf 个人收集电子书,仅用学习使用,不可用于商业用途,如有版权问题,请联系删除!
python多
线程
是假的!速度慢!效率低下!不升反降!
Python中的多
线程
是假的多
线程
! 因为Cpython解释器有一个东西叫全局解释器锁(GIL)。在解释器解释执行 Python 代码时,先要得到这把锁,意味着,任何时候只可能有一个
线程
在执行代码,其它
线程
要想获得 CPU 执行...
JAVA多
线程
精讲下
本课程是《零基础学Java》系列课程中的"多
线程
"相关课程.授课形式延续了之前课程的授课风格。内容细腻、详尽,由浅入深!通过本门课程的学习你可以深刻理解Java多
线程
的原理及实现运行机制,深刻学习多
线程
的生命...
java过程优雅关闭
线程
!
文本将介绍两种可以优雅的终止
线程
的方式…第一种在JAVA《Java多
线程
模式》中有一种叫Two-Phase Termination(两步终止)的模式可以优雅的终止
线程
,这种模式采用了两个步骤来终止
线程
,所以叫两步终止模式。...
Java多
线程
(超详细!)
什么是
线程
? 进程是:一个应用程序(1个进程是一个软件)。
线程
是:一个进程中的执行场景/执行单元。 注意:一个进程可以启动多个
线程
。 eg.对于java程序来说,当在DOS命令窗口中输入: java HelloWorld 回车之后。...
Delphi
5,386
社区成员
262,729
社区内容
发帖
与我相关
我的任务
Delphi
Delphi 开发及应用
复制链接
扫一扫
分享
社区描述
Delphi 开发及应用
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章