Delphi 版里面没人回答,来BCB问问~~ TServerSocket 使用多线程,在还有客户端连接时退出,会停顿好久,如何解决?
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;
implementation
uses 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.
而子线程也没做什么。只是一般的发送消息与接收消息,客户端更简单。
各位大侠帮帮小弟,实在解决不了了,看了别人的源码,还看了书,又找了资料都不行……