社区
Delphi
帖子详情
关于线程!
Antiquesoft
2005-11-26 04:20:47
线程在执行一个长时间的操作/循环时使用,如果是收数据的速度很快,保存数据的速度相对慢的话,最主要的不是用几个ADOQuery而是如何将这发来的数据快速接收。你的串口一秒能来多少数据呀!
要不还是开一个缓冲区,将串口来的数据全部先保存到缓冲区中,然后开一个线程,线程时创建一个ADOQuery将缓冲区数据保存。这样你的数据来的在快也没有关系了。
在坛子里看到一位仁兄以上见解,小兄弟尚有不解之处!
能否以一段代码来说明?
...全文
225
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
打赏
举报
回复
开缓冲区,如果你的存数据的速度一直很满的话,那是不是你的缓冲区的越来越大,会不会导致溢出,或数据丢失.
系统
线程
nt!CcPfBootWorker里面的nt!MmPrefetchPages函数分析
博客主要对系统
线程
nt!CcPfBootWorker里的nt!MmPrefetchPages函数进行分析。先介绍了CcPfBeginBootPhase函数创建系统
线程
CcPfBootWorker,随后展示了相关调试信息,包括函数调用栈、寄存器值、内存数据等,还对一些数据结构如_MI_READ_LIST、_FILE_OBJECT等进行了分析。
WinDBG 技巧:显示进程/
线程
环境参数(!peb 和 !teb 命令)
本文介绍了PEB(进程环境块)和TEB(
线程
环境块)的概念,PEB存放进程信息,TEB保存
线程
相关数据,二者均位于用户地址空间。还展示了在WinDBG中使用!peb和!teb命令显示相关信息,通过输出结果可了解进程和
线程
的诸多关键信息。
命令
线程
windbg之使用!list指令遍历双向链表
本文详细介绍如何使用Windbg的!list命令来遍历Windows内核中的双向链表,并通过实例展示了如何查看活动进程列表及进程的
线程
列表。此外,还介绍了如何在!list命令中组合多个子命令以及使用#CONTAINING_RECORD宏简化命令。
nt!KiDispatchInterrupt函数调用nt!KiQueueReadyThread和调用nt!SwapContext切换
线程
到NextThread的一个例子老
线程
时间片没有用完--非常重要
本文通过调试日志详细分析了nt!KiDispatchInterrupt如何触发
线程
调度,展示其调用nt!KiQueueReadyThread将当前
线程
置为就绪态,并最终通过nt!SwapContext完成上下文切换的过程。重点揭示了高优先级
线程
抢占低优先级
线程
时,即使原
线程
时间片未耗尽也会发生调度的行为机制。
ACPI!IsNsobjPciBus看event从主
线程
到异步
线程
之异步
线程
到nt!KeSetEvent预先分析和重要断点ACPI!DispatchCtxtQueue+0xaf--重要
本文通过调试日志分析ACPI驱动中事件从主
线程
传递到异步
线程
的过程,重点研究nt!KeSetEvent在ACPI!DispatchCtxtQueue+0xaf处的触发机制。结合内核栈回溯和关键数据结构如AMLISUPP_CONTEXT_PASSIVE、IS_PCI_BUS_STATE等,揭示了异步完成例程如何通过事件通知实现
线程
间同步,涉及ACPI子系统中的任务调度与资源等待。
Delphi
5,943
社区成员
262,943
社区内容
发帖
与我相关
我的任务
Delphi
Delphi 开发及应用
复制链接
扫一扫
分享
社区描述
Delphi 开发及应用
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章