Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.05.30;
Скачать: CL | DM;

Вниз

Блокирующие Сокеты: можно ли так делать...   Найти похожие ветки 

 
Makhanev A.S. ©   (2004-04-08 16:21) [0]

type
 TMyClientSocketThread = class(TThread)
 private
   FClient: TCustomWinSocket;
   SockStream: TWinSocketStream;
...

constructor TMyClientSocketThread.Create(ClientSocket: Pointer);
begin
 inherited Create(False);
 FClient := ClientSocket;
 SockStream := TWinSocketStream.Create(FClient, 20000);
end;

destructor TMyClientSocketThread.Destroy;
begin
 SockStream.Free;
 inherited;
end;

procedure TMyClientSocketThread.Execute;
...
 while (not Terminated) and (FClient.Connected) do
 begin
   if SockStream.WaitForData(ReplyTimeOut) then
   begin

    if FClient.ReceiveLength = 0 then
       Exit;
//??


При дисконнекте этого клиента по его же инициативе - я прсто выключаю этот thread.
При дисконнекте по инициативе сервера OnDisconnect на клиенте (TClientSocket, которому принадлежит FClient: TCustomWinSocket) не наступает.

Поэтому поток попадает в бесконечный цикл (FClient.Connected=True, WaitForData происходит мгновенно, получая в сокет 0 байт).

Поэтому я решил ввести условие:

    if FClient.ReceiveLength = 0 then
       Exit;


Правильно ли так поступать?
Мои тесты ошибок не показали.

Буду благодарен за ответы.
Если мои доводы непонятны, готов всё пояснить.


 
Verg ©   (2004-04-08 17:38) [1]


>  if SockStream.WaitForData(ReplyTimeOut) then
>    begin
>
>     if FClient.ReceiveLength = 0 then
>        Exit; //??


Да, так делать можно, конечно.
Можно даже проще

 if SockStream.WaitForData(ReplyTimeOut) then
 begin
   //После этого обязательно что-нибудь типа такого:
   res := SockStream.Read(....) // где res : integer;
   if res = 0 then // Результат Read в этой ситуции - признак разрыва соединения
     break;
..........


 
Makhanev A.S. ©   (2004-04-08 18:45) [2]


> Verg ©   (08.04.04 17:38) [1]

большое спасибо за ответ.
всё понятно.



Страницы: 1 вся ветка

Текущий архив: 2004.05.30;
Скачать: CL | DM;

Наверх




Память: 0.44 MB
Время: 0.039 c
14-1083906425
ORMADA
2004-05-07 09:07
2004.05.30
Почему КЛАДОВКА не работает ?


4-1082532597
LAndrey
2004-04-21 11:29
2004.05.30
Работа с MSExcel в отдельном потоке


6-1081799593
DED_MustDie
2004-04-12 23:53
2004.05.30
non-blocking


3-1083847962
ПрогерШ
2004-05-06 16:52
2004.05.30
Как узнать всю информацию о поле?


3-1083934880
Skulll
2004-05-07 17:01
2004.05.30
Синтаксис Query





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский