Я пишу приложение, которое использует Indy 10 TCP / IP Client и TThread
. Приложение подключается к серверу по событию Form.OnCreate
и отключается от него по событию Form.OnClose
. Подключение к серверу осуществляется в TThread
.
Когда я запускаю приложение, когда кабель Ethernet отключен, и пытаюсь закрыть приложение до истечения времени подключения, я получаю два исключения:
- 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;