Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Разное
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
  #16  
Старый 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;

Последний раз редактировалось seeman_tm, 12.02.2013 в 18:15.
Ответить с цитированием
 


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 06:05.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025