我在TIndyTCPServer的Execute事件中用ReadBuffer读到数据后,创建一个窗体并显示这个窗体,显示后窗体被冻结,无法响应,不知道大家遇到过这种情况没有,是什么原因?以下是代码片断:procedure TfrmServers.serverExecute(AThread: TIdPeerThread);
var
  CB: TCommBlock;
  Client: PClient;  frmRecv: TfrmRecv;
  frmRecving: TfrmRecving;
begin
  if not AThread.Terminated and AThread.Connection.Connected then
  begin
    AThread.Connection.ReadBuffer(CB,SizeOf(TCommBlock));
    Client := PClient(AThread.Data);    if (CB.Command = MT_QUERY) then
    begin      
      frmRecv := TfrmRecv.Create(nil);
      frmRecv.Client := Client;
      frmRecv.DoQuery(CB);
      frmRecv.Show;
   //代码执行到这里以后,frmRecv显示出来,但被冻结,无法响应 
    end
    else if (CB.Command = MT_DATA) then
    begin   
      frmRecving := TfrmRecving(Client.FrmHdl);
      frmRecving.DoData(CB);
    end
    else if (CB.Command = MT_END) then
    begin
      frmRecving := TfrmRecvingF(Client.FrmHdl);
      frmRecving.DoEnd(CB);
    end
    else if (CB.Command = MT_ABORT) then
    begin
      frmRecving := TfrmRecving(Client.FrmHdl);
      frmRecving.DoAbort(CB);
    end;
  end;
end;

解决方案 »

  1.   

    放个TIdAntiFreeze上去,在misc页中
      

  2.   

    使用线程来进行数据接收和处理是最好的办法。我不建议使用AntiFreeze
      

  3.   

    谢谢各位。我试放TIdAntiFreeze了,不起作用。我这里是仿Indy里那个IdTCPDemo的例子做的。那个例子的服务器端和我这里一样,并没有采用多线程的方法。倒是它的客户端使用了一个单独的线程,用于记取从服务器返回的数据。我现在还不考虑我的客户端是否像IdTCPDemo一样用多线程的方法。现在的问题是出现在服务器端。我在两台机器上测试,一台(作为发送方的客户端)向一台(作为接收文件的服务器端)发送文件,服务器端就出现了我上面的问题。请再帮我想想这里什么问题?对了,Execute事件是什么情况下发生的?服务器在接收到一个传送文件请求的CommBlock,这个事件好像不止触发一次哩?