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;
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;