Delphi 版里面没人回答,来BCB问问~~ TServerSocket 使用多线程,在还有客户端连接时退出,会停顿好久,如何解决?

xiaoxiaobai 2003-09-08 02:47:55
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.

而子线程也没做什么。只是一般的发送消息与接收消息,客户端更简单。
各位大侠帮帮小弟,实在解决不了了,看了别人的源码,还看了书,又找了资料都不行……
...全文
52 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
leapmars 2003-09-11
  • 打赏
  • 举报
回复
Mark
pp616 2003-09-09
  • 打赏
  • 举报
回复
推荐用socket api 用起来比较舒服。
你的问题如果用api来写的话断开后立即可以处理。
kingcaiyao 2003-09-08
  • 打赏
  • 举报
回复
我用过socket api和C++ Builder的TServerSocket,TClientSocket,均未发现你所说的问题:
http://www.csdn.net/develop/read_article.asp?id=19882
http://www.csdn.net/develop/read_article.asp?id=19883
kingcaiyao 2003-09-08
  • 打赏
  • 举报
回复
如果服务器线程正在处理数据时突然断开,这样或许要等待一定的时间。
如果数据已处理完毕而关闭服务器,则不会有你所说的情况。
叶子哟 2003-09-08
  • 打赏
  • 举报
回复
是不是你的网络有问题呀!

1,317

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧