大家好:
   我在用socket开发通信软件时,发现如果客户机采用循环方式,不停的向服务器发送数据,用
Tserversocket控件的OnClientRead事件读取,发现这个事件根本没那么快的速度响应,我该怎么办啊?能说说吗?哪怕是一点思路也行啊,谢谢了.

解决方案 »

  1.   

    你把读取过程放在一个reveive的线程你看一下,可能解决问题
      

  2.   

    我用的是tserversocket控件,没有直接用那个函数,请问怎么把那个控件放入一个线程中啊.因为我需要那个控件的onclientread事件.
      

  3.   

    由于不能够确定TServerSocket的底层是否用了线程,也不能够确定它是否有相应的线程安全机制。所以,你直接在OnClientRead里面把收到的内容显示出来(也就是用到了不是线程安全的VCL组件),出现混乱的几率是比较大的。你先尝试一下,把收到的内容先防在一个String变量里面,在窗体上放个Timer来触发显示的过程,而不要直接在OnclientRead里面调用显示过程。
      

  4.   

    多谢各位大哥,很热心,能在问一下,我现在用了个微软的包开发DOS网络,但遇到了recv()函数,发现它是阻塞的,这可麻烦了,因为它收不到数据就一直在这等导致其他任务没法干,怎么办啊?总不能老等吧.或者是怎么改为非阻塞的.
      

  5.   

    这是TserverSocket的OnClientRead中的代码:
    var
      Buf:array of char;
      len:integer;
      i:integer;
    begin
      len:=Socket.ReceiveLength;
      setlength(buf,len);
      Socket.ReceiveBuf(buf[0],len);  Edit2.Text:= Buf[0];
      Edit3.Text:= Buf[1];
      Edit4.Text:= Buf[2];
      Edit6.Text:= Buf[3];
      Edit7.Text:= Buf[4];
      Edit8.Text:= Buf[5];
      Edit9.Text:= Buf[6];
      Edit10.Text:= Buf[7];
      Edit11.Text:= Buf[8];