线程在执行一个长时间的操作/循环时使用,如果是收数据的速度很快,保存数据的速度相对慢的话,最主要的不是用几个ADOQuery而是如何将这发来的数据快速接收。你的串口一秒能来多少数据呀!要不还是开一个缓冲区,将串口来的数据全部先保存到缓冲区中,然后开一个线程,线程时创建一个ADOQuery将缓冲区数据保存。这样你的数据来的在快也没有关系了。
在坛子里看到一位仁兄以上见解,小兄弟尚有不解之处!能否以一段代码来说明?
在坛子里看到一位仁兄以上见解,小兄弟尚有不解之处!能否以一段代码来说明?
TComDataInfo=Record
Name:String[255];
Field1:Integer;
end;
每2毫秒会收到这样的一条数据要将所有收到的数据保存到表 Table_B 中,如果保存数据的时间为5毫秒.则可能收到的数据没有保存新的数据就又来了,而且还会造成程序无法操作象死机一样。所以可以先定义一个数组: ComDataArr:Array of TComDataInfo;
所有收到的数据先保存到这个数组中,所以不会造成数据的丢失。
创建一个线程,总是在检查ComDataArr数组的长度发现有数据就保存到Table_B中。也就不会造成程序无法操作。当然如果收数据的速度比较慢,直接保存就可以了。
如果数据来的更快,如网络游戏中服务器端的程序,因为同时有非常多的玩家发消息上来,就要用端口映射的方式,让系统帮你直接将收到的数据放到你所开辟的的内存中比上面的方式省了复制的时间。当然也有可能缓冲区会满,所以要合理定义缓冲区,添加内存或者给发数据的一方通知让暂停发送。这些都是要根据收取数据的速度处理的速度来选择用什么样的方法。
2.楼上的数据采集有点夸张,目前COM口最大的传输速度应该是115Kbps吧,也就是说1秒中最多11K BYTE左右的信息量。
保存B位置的数据后Inc(B,-1); 如果A=B则说明缓冲区中没有数据. 游标A<0后如果B=最大索引号则说明缓冲区满了,否则A=最大索引号。当然将缓冲区的操作要封装成一个对象。可以将它写一个为适合任何大小的结构体。关于双向队列可以找本《数据结构》来看看。