我确实编写了一个应用程序,它使用 Indy 10 TCP/IP 客户端和TThread
. 该应用程序在事件时连接到服务器并在Form.OnCreate
事件时断开与它的连接Form.OnClose
。与服务器的连接是在TThread
.
当我在以太网电缆断开连接的情况下启动应用程序并尝试关闭应用程序直到连接超时时,我确实得到了这两个异常:
- Socket.Error #10038 非套接字上的套接字操作。
- 线程错误:句柄无效(6)。
如果我在连接到客户端时尝试关闭应用程序,那么我只会得到这个异常:
- 线程错误:句柄无效(6)。
如果我在线程执行睡眠时关闭应用程序,那么我不会得到任何异常。
我做错了什么,或者这是正常行为?
TThread
班级代码:
type
connThread = class (TThread)
protected
procedure Execute ; override;
private
procedure Sinchronizuot(zinute : string; spalva : TColor; tmrNormalReconn : Boolean);
end;
Form.OnCreate
代码:
procedure TForm1.FormCreate(Sender: TObject);
begin
fellnerConn := connThread.Create(True);
fellnerConn.FreeOnTerminate := True;
fellnerConn.Start;
end;
Form.OnClose
代码:
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if fellnerConn <> nil then
fellnerConn.Terminate;
if idCl.Connected then
begin
try
idCl.Disconnect;
idCl.IOHandler.Free;
finally
if fellnerConn <> nil then
begin
fellnerConn.WaitFor;
fellnerConn := nil;
end;
end;
end;
end;
线程执行代码:
procedure connThread.Execute;
var
zinute : string;
spalva : TColor;
begin
inherited;
while not Form1.fellnerConn.Terminated do
begin
zinute := 'Jungiamasi prie Moxa serverio ' + Form1.idCl.Host;
spalva := clYellow;
Synchronize(procedure
begin
Sinchronizuot(zinute, spalva, False);
end
);
try
Form1.idCl.Connect;
except
on E: Exception do
begin
zinute := e.Message + ' Nepavyko prisijungti.';
spalva := clWebRed;
Synchronize(procedure
begin
Sinchronizuot(zinute, spalva, False);
end);
Sleep(1000);
end;
end;
end;
end;