TServerSocket 使用多线程,在还有客户端未断开时退出,会停顿好久(我想应该是在等待线程结束),如何解决?
我的源程序如下:type
  TForm1 = class(TForm)
    ServerSocket1: TServerSocket;
    PageControl1: TPageControl;
    TabSheet1: TTabSheet;
    ListView1: TListView;
    TabSheet2: TTabSheet;
    Label1: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure ServerSocket1GetThread(Sender: TObject;
      ClientSocket: TServerClientWinSocket;
      var SocketThread: TServerClientThread);
    procedure ServerSocket1ThreadEnd(Sender: TObject;
      Thread: TServerClientThread);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    thList : TThreadList;    function AddClient(IP, Host:String):Integer;
    procedure UpdateThreadCount;
  public
    { Public declarations }
  end;var
  Form1: TForm1;implementationuses Threads;{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
begin
  thList := TThreadList.Create;
  ServerSocket1.Open;
end;function TForm1.AddClient(IP, Host:String): Integer;
begin
   with ListView1.Items.Add do
   begin
      Caption := Host;
      SubItems.Add(IP);
      SubItems.Add('就绪');
      Result := Index;
   end;
end;procedure TForm1.UpdateThreadCount;
begin
  Label1.Caption := '线程数量:'+IntToStr(ListView1.Items.Count);
end;procedure TForm1.ServerSocket1GetThread(Sender: TObject;
  ClientSocket: TServerClientWinSocket;
  var SocketThread: TServerClientThread);
var
  NewItem : Integer;
begin
  NewItem := AddClient(ClientSocket.RemoteAddress, ClientSocket.RemoteHost);
  SocketThread := TFileServerThread.Create(NewItem, ClientSocket);
  thList.Add(SocketThread);
  UpdateThreadCount();
end;procedure TForm1.ServerSocket1ThreadEnd(Sender: TObject;
  Thread: TServerClientThread);
var
  i : Integer;
begin
  ListView1.Items.Delete(TFileServerThread(Thread).GetIndex);
  UpdateThreadCount();
  with thList.LockList do
    for i := 0 to Count -1 do
      if Thread = Items[i] then
      begin
        Delete(i);
        Exit;
      end;  thList.UnlockList;
end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var
  i : Integer;
  sf : TThread;
begin
  with thList.LockList do
    for i := 0 to Count -1 do
    begin
      sf := Items[i];
      sf.Terminate;
    end;  thList.UnlockList;  thList.Clear;
  thList.Free;
  ServerSocket1.Close;
end;end.而子线程也没做什么。只是一般的发送消息与接收消息,客户端更简单。
各位大侠帮帮小弟,实在解决不了了,看了别人的源码,还看了书,又找了资料都不行……

解决方案 »

  1.   

    在delphi下面,最好不要创建超过5个线程。在循环里面最好加上停顿语句!
      

  2.   

    大概看了一下代码,我注意到有些地方你直接调用了UpdateThreadCount();如这里:
    procedure TForm1.ServerSocket1GetThread(Sender: TObject;
      ClientSocket: TServerClientWinSocket;
      var SocketThread: TServerClientThread);
    var
      NewItem : Integer;
    begin
      NewItem := AddClient(ClientSocket.RemoteAddress, ClientSocket.RemoteHost);
      SocketThread := TFileServerThread.Create(NewItem, ClientSocket);
      thList.Add(SocketThread);
      UpdateThreadCount();////这里
    end;
    由于这个过程访问了vcl,但没有同步,应该使用线程安全的同步访问:
    Synchronize(UpdateThreadCount)