Показать сообщение отдельно
  #19  
Старый 12.02.2013, 18:11
Аватар для seeman_tm
seeman_tm seeman_tm вне форума
Новичок
 
Регистрация: 03.02.2011
Сообщения: 79
Репутация: -2306
По умолчанию

Цитата:
Сообщение от 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;
Ответить с цитированием