我写了一个多线程程序,
TReceiveMsgThread = class(TThread)
这个类的Execute里面就是不断调用TcpClient的ReadLn函数。
procedure TReceiveMsgThread.Execute;
begin
  try
    while (not Terminated) and (FTcpClient.Connected) do
    begin
      try
        revData := FTcpClient.ReadLn(FMsgEndStr);   //  FMsgEndStr表示信息结尾符
        revData := revData + FMsgEndStr;   // 读取的tcp数据不含结尾
        Synchronize(HandleRevData);
      except
        if FTCPClient.Connected then FTCPClient.Disconnect;
        Terminate;
      end;
    end;   // while
  except
  end;
end;
线程的FreeOnTerminate := false; 现只要我显式调用线程的Free函数想销毁线程,就进入了死循环,程序就卡主了,请问是什么原因,怎么解决?

解决方案 »

  1.   

    var 
      ReceiveMsgThread: TReceiveMsgThread;  if Assigned(ReceiveMsgThread) then
      begin
        ReceiveMsgThread.Terminate;
        if ReceiveMsgThread.Suspended then
          ReceiveMsgThread.Resume;
        ReceiveMsgThread.WaitFor;
        ReceiveMsgThread.Free;
      end;
      

  2.   

    想请教一下,结束线程时为什么要启动线程呢?
    if ReceiveMsgThread.Suspended then
          ReceiveMsgThread.Resume;
      

  3.   

    想请教一下,结束线程时为什么要启动线程呢?
    if ReceiveMsgThread.Suspended then
          ReceiveMsgThread.Resume;怕线程被Suspended了,所以要Resume起来
      

  4.   

    想请教一下,结束线程时为什么要启动线程呢?
    if ReceiveMsgThread.Suspended then
          ReceiveMsgThread.Resume;怕线程被Suspended了,所以要Resume起来
    是不是线程被Suspended了,就不能销毁啊?
      

  5.   

    想请教一下,结束线程时为什么要启动线程呢?
    if ReceiveMsgThread.Suspended then
          ReceiveMsgThread.Resume;怕线程被Suspended了,所以要Resume起来
    是不是线程被Suspended了,就不能销毁啊?被suspended了,你程式就会结束不了,卡在那里
    不过你现在问题应该不在这,可能像楼上说的ReadLn上
    TcpClient最好不要放在线程中,也不需要放在线程中。
      

  6.   

    按你说的, 不要  ReceiveMsgThread.WaitFor;这一句,好像问题已经解决了。
    另外你说
    “TcpClient最好不要放在线程中,也不需要放在线程中。”
    那对于delphi 7的TIdTCPClient,该如何接收来自服务器发过来的数据?
    有什么好的方法吗?
      

  7.   

    那对于delphi 7的TIdTCPClient,该如何接收来自服务器发过来的数据?
    用线程通讯肯定没错,FreeOnTerminate := true
    释放时,直接将实例 Terminate,客户端手动断开与服务端的连接
     
      

  8.   

    楼主可以参考一下IndyDemos\IdTCPDemo的例子,客户端都是创建一个线程与服务端通讯的