线程在执行一个长时间的操作/循环时使用,如果是收数据的速度很快,保存数据的速度相对慢的话,最主要的不是用几个ADOQuery而是如何将这发来的数据快速接收。你的串口一秒能来多少数据呀!要不还是开一个缓冲区,将串口来的数据全部先保存到缓冲区中,然后开一个线程,线程时创建一个ADOQuery将缓冲区数据保存。这样你的数据来的在快也没有关系了。
在坛子里看到一位仁兄以上见解,小兄弟尚有不解之处!能否以一段代码来说明?

解决方案 »

  1.   

    来代码就不用了吧!一时还找不到现成的代码。如:串口Com_A收到的数据为如是下的结构
    TComDataInfo=Record
     Name:String[255];
     Field1:Integer;
    end;
    每2毫秒会收到这样的一条数据要将所有收到的数据保存到表 Table_B 中,如果保存数据的时间为5毫秒.则可能收到的数据没有保存新的数据就又来了,而且还会造成程序无法操作象死机一样。所以可以先定义一个数组: ComDataArr:Array of TComDataInfo;
    所有收到的数据先保存到这个数组中,所以不会造成数据的丢失。
    创建一个线程,总是在检查ComDataArr数组的长度发现有数据就保存到Table_B中。也就不会造成程序无法操作。当然如果收数据的速度比较慢,直接保存就可以了。
    如果数据来的更快,如网络游戏中服务器端的程序,因为同时有非常多的玩家发消息上来,就要用端口映射的方式,让系统帮你直接将收到的数据放到你所开辟的的内存中比上面的方式省了复制的时间。当然也有可能缓冲区会满,所以要合理定义缓冲区,添加内存或者给发数据的一方通知让暂停发送。这些都是要根据收取数据的速度处理的速度来选择用什么样的方法。
      

  2.   

    1.不建议用数组,固定数组浪费空间,数据挪移不方便,需要用独立变量做标志。动态数组的反复开辟也消耗时间,建议用链表方式,如TLIST。
    2.楼上的数据采集有点夸张,目前COM口最大的传输速度应该是115Kbps吧,也就是说1秒中最多11K BYTE左右的信息量。
      

  3.   

    对于Com口来说是有点夸张。只是举个例子。固定数组是最好的,刚才也准备说用固定数组,只是用动态数组说明这个问题更简单一些。固定数组的好处是一次分配好内存以后不用在浪费分配的时间,释放时也更容易。固定数组的问题在于添加和删除时因为是多个线程,所以有同步的问题,如果用了同步线程的方式则会浪费时间,所以要技巧性的解决。用固定数组实现一个从头开始添加从尾开始删除的队列可以解决要维护两个游标A,B,都初始化为数组最大索引号,收到一条数据将它保存到A位置,然后Inc(A,-1);
    保存B位置的数据后Inc(B,-1); 如果A=B则说明缓冲区中没有数据. 游标A<0后如果B=最大索引号则说明缓冲区满了,否则A=最大索引号。当然将缓冲区的操作要封装成一个对象。可以将它写一个为适合任何大小的结构体。关于双向队列可以找本《数据结构》来看看。
     
      

  4.   

    不论怎么说,我感觉串口还是个低速I/O,想让他达到nMB/s的速度是不大可能的吧