在Delphi中,我有一个线程客户端,用于侦听线程中的响应。 线程声明如下:
TMyThread = class(TThread)
private
FClient: TIdTCPClient;
FStringResponse: string;
protected
procedure Execute; override;
procedure DoSynch;
public
constructor Create(AClient: TIdTCPClient);
end;
我使用:
连接 if not IdTCPClient1.Connected then
begin
// // Set the Host
IdTCPClient1.Host := Edit1.Text;
// // Set the port
IdTCPClient1.Port := 65535;
// // Connect
IdTCPClient1.Connect;
try
MyThread := TMyThread.Create(IdTCPClient1);
except
IdTCPClient1.Disconnect;
raise;
end;
end;
我尝试断开使用:
if MyThread <> nil then
begin
MyThread.Terminate;
// MyThread.WaitFor;
MyThread.Free;
MyThread := nil;
IdTCPClient1.Disconnect;
end;
但是这个断开连接代码会引发异常。什么是终止此线程和断开客户端的正确方法?
答案 0 :(得分:4)
尝试颠倒关机操作的顺序 - 在释放线程之前断开客户端,而不是相反。这样,线程内的任何阻塞套接字操作都会被中止,允许线程对终止做出反应:
if MyThread <> nil then
MyThread.Terminate;
try
IdTCPClient1.Disconnect;
finally
if MyThread <> nil then
begin
MyThread.WaitFor;
MyThread.Free;
MyThread := nil;
end;
end;
如果您仍然从Disconnect()
获得异常,请确保该线程没有断开客户端,只读取/写入它,并将Disconnect()
包装在自己的try/except
中如果需要阻止。