Socket接收数据并进行缓存:List:Strings;
procedure TXMlData.OnReadData(Sender: TObject; Socket: TCustomWinSocket); //OnRead事件对应的过程
begin
  BeforeResolveData:=TStringList.Create;
  BeforeResolveData.Text:=Socket.ReceiveText;//每秒收到800条左右的数据
  List.AddObject(IntToStr(Index),BeforeResolveData);
  while List.Count>0 do
  begin
    ProcessData;//些过程用处理 AlarmList中缓存的数据,此过程比较耗时间 
  end;
end;ProcessData放在Socket接收中会不影响Socket接收数据?接收大量为防止处理不过来,有没有什么好的方法,请高手指点。我觉得象上面这么做会有问题,比如现在正执行while这时又来了一个新的数据Soket能不能接收?它还会存到List中去吗?

解决方案 »

  1.   

    还有一点忘记了就是在BeforeResolveData:=TStringList.Create;之前有一个Index:=Index+1;
      

  2.   

    : lxpbuaa
    现在是只能被动的接收数据,怎么样做才保证不丢失数据呢?有没有好的建议?
      

  3.   

    zsy_good
    不是这个问题,即使发1024他字节,也不能解问题,因为发送的频率比较大,而不是数据量大的问题。还有如果按你这么做,实际是做数据缓存放在服务器端,在我这里是不可能的,因为要接收数据的服务器,只是一个数据转发服务器,不对数据进行任何处理。
      

  4.   

    starcbh:
    你是说当While执行的时候,Socket就不接收数据了,也不往List里存了?那需要用什么方法才可以呢?
      

  5.   

    如果是tcp协议,你的客户端如果没有接收,或者来不及接收,服务器端是不会不停的发的,服务器端会阻塞,等待客户端的接收。
      

  6.   

    如果只是转发,但又担心数据量太大处理不了,那就把还未转发的数据先送到一个Buf存起来,发送时再按发送区的情况(如发送是否完成)按顺序读入。接收应该是最高优先级的线程
      

  7.   

    mj_hc(实变函数) 说的是有道理的,采用tcp协议时不必要担心这个问题。
    不过在不考虑协议和不能改变服务端传送方式的情况下,可以这样来作:
    在客户端将数据接收和处理分开,也就是:
    BeforeResolveData.Text:=Socket.ReceiveText;//接收数据

    ProcessData;
    不要都放在TXMlData.OnReadData中。TXMlData.OnReadData应该只管接收,然后用另外一个线程专门来ProcessData(处理数据)。————————————————————————————————————
    宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
    ————————————————————————————————————
      

  8.   

    : lxpbuaa
    线程方式有个疑问,因为程序实时性要求很高,就是说,从转发服务器接收来的数据必须及时的处理。如果用线程来做怎么会知道什么时间来数据?是不是可以让线程始终在执行,比如:
        while 1 > 0 do
        begin
              Synchronize(ProcessData);
        end;
    这个样子是可以,但是CPU占用太大, 如果Sleep();一下,就不能做到实时了