服务端为何无法关闭?(50分)

  • 主题发起人 主题发起人 anon2002
  • 开始时间 开始时间
A

anon2002

Unregistered / Unconfirmed
GUEST, unregistred user!
用IdTCPServer做服务端程序,如果客户端全部断开就可以停止服务,如果还存在客户端连接就会报错。

服务端的连接我用了一个TThreadList变量保存,这是程序退出的代码:

procedure TData.DataModuleDestroy(Sender: TObject);
var
I:Integer;
Client:PClient;
CThread:TIdPeerThread;
begin
 //如果加入下面这一段代码,程序就无法退出,如果不加就报错。(我指存在客户端连接未断开的情况)
//Clients是保存客户端连接的TThreadList类。
for I:=0 to Clients.LockList.Count-1 do
begin
Client:=Clients.LockList.Items;
CThread:=Client.Thread;
CThread.Connection.DisconnectSocket;
end;
//如果加入上面这一段代码,程序就无法退出,如果不加就报错。(我指存在客户端连接未断开的情况)

ADOConnection.Close;
IdTCPServer.Active:=False;
end;
 
服务端报错:“Terminate thread timeout”

谁能回答我?
 
设置以下超时时间
 
TerminateWaitTime默认是5000啊。还要改成多大?而且我只是试了一个客户端连接,要是同时有一百个连接,那服务端不是不用关闭了?
 
谁来救救我啊!!!!!!!!!!!!!!!!!!!
 
为什么没人理?
 
改成这样呢?我不知道你是怎么管理session 的,倒过来

for I:=Clients.LockList.Count-1 downto 0 do //////////
begin
Client:=Clients.LockList.Items;
CThread:=Client.Thread;
CThread.Connection.DisconnectSocket;
end;
 
还是不行,好象服务端无法关闭客户端连接???奇怪。
 
同意jsxjd的方法
 
可是该方法无效:(,还有谁有更好的建议吗?
 
// Server为控件名
with Server.Threads.LockList do
try
for I := 0 to Count-1 do // iterate through client-list
begin
TIdPeerThread(Items).Connection.Disconnect;
TIdPeerThread(Items).Terminate;
end;
Clear; // 关键在这里
finally
Server.Threads.UnlockList;
end;
 
你在每个线程中检验Terminate;属性,如果是true就退出线程,
TIdPeerThread(Items).Terminate方法只是把Terminate属性置为true,退出的代码还是要自己写的,我就是这样做的,没有任何问题
 
后退
顶部