全部分送上,请教大家, TIdTCPServer 在有客户端连接的情况下,要怎么关闭比较好? ( 积分: 62 )

  • 主题发起人 主题发起人 SuKiDelphi
  • 开始时间 开始时间
S

SuKiDelphi

Unregistered / Unconfirmed
GUEST, unregistred user!
//Server

TIdTCPServer 在有客户端连接的情况下,要怎么关闭比较好?我现在直接把Active赋为false,要出错。

procedure TForm1.FormDestroy(Sender: TObject);
var
I : Integer;
AThread: TIdPeerThread;
begin
// IdTCPServer1.Active:=false 要出错。

// 如果这里不写 TIdTCPServer 相关的代码, 有部分 Client 会收不到 Disconnected 事件


// Client

// 收到 Disconnected 事件后, 重新连接,如果不是这样做, 下次 打开"TIdTCPServer"..

procedure TMRClient.IdTCPClient1Disconnected(Sender: TObject);
begin
IsConnected:=False;

if not IsUserClose then
begin

if CSThread <> 0 then
begin
TerminateThread(CSThread, 0);
CSThread:=0;
end;
//Sleep(3000);
CSThread := CreateThread(nil, //线程安全属性地址,一般设为nil,使用缺省的安全属性。当我们想此线程有另外的子进程时,可改变它的属性。
0, //线程堆栈尺寸,一般设为0,表示与此应用的堆栈尺寸相同,即主线程与创建的线程一样长度的堆栈。并且其长度会根据需要自动变长。
@ConnectServer, //一个指向函数名的指针,但传递时很简单,只需在线程函数名前加上@ 就可以了。
nil, // 给线程函数传递的参数 一般是一个指向结构的指针。不需传递参数时,则这个参数设为nil。
0, //传入与线程有关的一些标志,
//如果是CREATE_SUSPENDED, 则创建个线程本身已创建,它的堆栈也已创建。但这个线程不会被分配给CPU 时间,只有当ResumeThread 函数被调用后才能执行;
//也可以调用SuspendThread 函数再次挂起线程。要是标志为0,那么一旦建立线程,线程函数就被立即调用。一般传为0 即可。
CSID); // 系统分配给这个线程的唯一的ID 标志。
end;
end;
end;
 
请参看这个例子(你可以多启动几个客户端,然后直接关闭服务器端——我的程序在OnClose里面设置了IdTCPServer.Active := False,一点问题都没有):
http://www.2ccc.com/article.asp?articleid=3894
实际上Indy都给你做好了一切了,只是你不会用,在乱用而已!
 
另外,有空去读读《提问的智慧》,像你这样一个问题发几个帖子的行为非常不好。
 
var
I: Integer;
Obj: TIdContext;
begin
with IdTCPServer1.Contexts.LockList do
try
for I := Count - 1 downto 0 do
begin
Obj := TIdContext(Items);
if Obj <> nil then
begin
Obj.Connection.Disconnect;

end;

end;
finally
IdTCPServer1.Contexts.UnlockList;
end;
IdTCPServer1.Active := False;
 
先多谢上面几位的指导....
我现在用的是INDY 9, 也写过上面的代码(jfyes 的), IdTCPServer1一用上面的代码就没响应了.....
 
接受答案了.
 
后退
顶部