我客户端用TIdTcpClient来接收数据,我是放在一个单独线程里的,当接收线程收到数据后会重画一个网格控件,因为数据量大时延迟会比较大,如果在在收到数据时同步画控件的话,界面会有间隙的死掉,我现在的思路是客户端维护一个队列,收到的数据放到队列里,然后当全部收完后再通知界面进行重画,但是我现在把界面的代码注掉了,接收线程里只接收网络包,界面还会卡住,这是为什么?  frmMain.tcpInfo.WriteBuffer(pData[0],len,true);
    Application.ProcessMessages; //在这边地方线程会等待,但是按理说只应该是接收线程等待,主线程(即界面)不应该也等待啊
  size:=frmmain.tcpInfo.ReadFromStack(FALSE,300*10000,FALSE);

解决方案 »

  1.   

    1. 在线程内, Application.ProcessMessages; 这条语句是肯定不能要的。
    2. "然后当全部收完后再通知界面进行重画",不知楼主是如何实现的。象楼主的这种程序,可以采用两个线程,一个线程负责从TIdTCPClient读取数据并写入队列,另一个线程负责从队列中取出数据并在主界面上显示。两个线程之间需要协调好对队列的访问权,这个可以通过临界区来实现。
      

  2.   

    是啊,我就是这样实现的,但是两个线程之间也要有一个变量用来在接收线程收完所有信息时通知重画线程进行重画,现在问题不在这,在于接收线程在调用 size:=frmmain.tcpInfo.ReadFromStack(FALSE,300*10000,FALSE);
    这条语句时会使整个应用程序阻塞,按理它只应该阻塞他自己才对