![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#16
|
||||
|
||||
![]() Цитата:
Не то чтобы нормальный выход из потока, но его я и взял на вооружение как наиболее удачный. Под не нормальным я имею в виду то, что у меня после вызова функции 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; Последний раз редактировалось seeman_tm, 12.02.2013 в 18:15. |