Цитата:
Сообщение от NumLock
ну так перед Terminate закрывай слушающий сокет и будет нормальный выход из потока.
|
Не то чтобы нормальный выход из потока, но его я и взял на вооружение как наиболее удачный.
Под не нормальным я имею в виду то, что у меня после вызова функции Accept и получения результата функции, идёт проверка на наличие ошибок с выводом той функции которая вызвала ошибку.
Вот код который был.
Код:
implementation
{ TCPServerTCP }
Procedure TServerThread.Execute;
Var
wData: WSADATA;
sServerListen, sClient: TSOCKET;
LocalAddr, ClientAddr: SockAddr_in;
iSize: Integer;
sl: TCPClientThread;
Begin
{Здесь всё тоже самое как в посте ранее.}
while not Terminated do
Begin
iSize := SizeOf(ClientAddr);
// Приём нового соединения
sClient := Accept(sServerListen, @ClientAddr, @iSize);
if sClient = INVALID_SOCKET then
Begin
TestWinSockError('accept');
Break;
end
Else
Begin
// Соединение принято, создаём поток
sl := TCPClientThread.Create(True);
sl.Sock := sClient;
sl.Resume;
End;
End;
sl.Terminate;
sl.WaitFor;
FreeAndNil(sl);
CloseSocket(sServerListen);
end;
Дабы окно об ошибке не появлялось, понадобилось изменить его так.
Код:
Var
sServerListen, sClient: TSOCKET; // Пришлось вывести переменные из процедуры в глобальные
WorkServerSocket: Boolean; // Понадобылась дополнительная переменная
implementation
{ TCPServerTCP }
Procedure TServerThread.Execute;
Var
wData: WSADATA;
LocalAddr, ClientAddr: SockAddr_in;
iSize: Integer;
sl: TCPClientThread;
Begin
{Здесь всё тоже самое}
while not Terminated do
Begin
iSize := SizeOf(ClientAddr);
// Приём нового соединения
sClient := Accept(sServerListen, @ClientAddr, @iSize);
if sClient = INVALID_SOCKET then
Begin
if WorkServerSocket then {Если истина то делай проверку и иди на следующую итерацию}
Begin
TestWinSockError('accept');
Break;
End Else Exit; // Иначе выходи из процедуры
end;
// Соединение принято, создаём поток
sl := TCPClientThread.Create(True);
sl.Sock := sClient;
sl.Resume;
End;
CloseSocket(sServerListen);
sl.Terminate;
sl.WaitFor;
end;