服务端使用的是Idtcpserver
用一个timer检测客户端是否异常退出,如果是,则终止该线程:
procedure Tform1.Timer1Timer(Sender: TObject);
var
  i, ti: Integer;
  ll: Tlist;
begin
try
 for ti := 0 to listview1.Items.Count - 1 do
  begin
   if strtoint(trim(listview1.Items[ti].SubItems.Strings[3])) > 50 then
    begin
     try
     ll := TCPServer.Threads.LockList;
      with ll do
       begin
        for i := 0 to Count - 1 do
         begin
          if TIdPeerThread(Items[i]).Connection.Socket.Binding.PeerIP = trim(listview1.Items[ti].SubItems.Strings[0]) then
           begin
            try
             TIdPeerThread(Items[i]).Stop;
             listview1.Items[ti].Delete;
             Break;
            except
            end;
            end;
           end;
          end;
     finally
      TCPServer.Threads.UnlockList;
     end;
    end;
   end;
except
end;问题是:当客户端(会自动检测服务端)连接后,把网线拔掉再插上,反复几次,服务端的CPU就100%了.
请问为什么?

解决方案 »

  1.   

    Idtcpserver 的 ondisconnect 的代码如下:procedure Tform1.TCPServerDisconnect(AThread: TIdPeerThread);
    var
      i, ii: Integer;
    begin
      try
      timer1.Enabled:=false;
        for i := 0 to listview1.Items.Count - 1 do
        begin
          if trim(listview1.Items[i].SubItems.Strings[0]) = AThread.Connection.Socket.Binding.PeerIP then
          begin
            try
              listview1.Items.Delete(i);
              timer1.Enabled:=true;
              break;
            except
            end;
          end;
        end;
      except
      end;
    end;
      

  2.   

    TIdPeerThread(Items[i]).free   ?