我在FORMS中加了一个idTcpServer控件,在onExecute事件中这样写:procedure Tform1.IdTCPServer1Execute(AThread: TIdPeerThread);
var cmd: string;
begin
  try
    cmd:= AThread.Connection.ReadLn(EOL);
    //这个方法对输入的cmd参数进行处理
    //并根据处理结果在窗体中显示相应的结果
    handleInput(AThread, cmd);
  except
    AThread.Connection.Disconnect;
    AThread.Terminate;
    Exit;
  end;
end;好象很简单,但是我运行以后,发觉接收到数据后,窗体就再也不会动了,好象死机一样,只能在任务管理器里把它中止,跟踪以后发现它处理完handleInput(AThread, cmd)这一句后就始终停留在cmd:= AThread.Connection.ReadLn(EOL)这一行,再也不动了,为什么呢?
要怎么处理?

解决方案 »

  1.   

    停在cmd:= AThread.Connection.ReadLn(EOL)这一句是因为indy是阻塞式的,程序会在这里等待接收数据,式正常的。“窗体就再也不会动了”是因为在线程里操作vcl控件要切换到主线程里面
    也就是handleInput(AThread, cmd);这一句,因该是涉及的窗口操作的吧,把它写成一个过程,
    用Synchronize(过程)来在主线程里执行另外,还可以放一个IdAntiFreeze控件,防止窗口无相应
      

  2.   

    谢谢,但是我并没有使用线程啊,从这个方法里也可以看出Tform1.IdTCPServer1Execute,这是窗体中主线程里的方法,怎么还要使用Synchronize同步方法呢?
    如何用?参数如何传递?
      

  3.   

    IdTCPServer为每个客户端建立一个线程。
    Tform1.IdTCPServer1Execute里面写的就是客户线程里面的代码