Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 2 [3]      все
 Re: TServerSocket и TService  [new]
Zelius
Member

Откуда: Россия, Москва
Сообщений: 1375
oklalex,

или наследовать свой класс потоков, который при создании нового потока будет передавать переменную Loop = False
constructor TIdThread.Create(ACreateSuspended: Boolean; ALoop: Boolean; const AName: string);
....
constructor TIdThreadWithTask.Create(ATask: TIdTask; const AName: string);
begin
  inherited Create(True, True, AName);
  FTask := ATask;
end;
.........
procedure TIdThread.Execute;
...............
              if Loop then begin
                while not Stopped do begin
                  try
                    Run;
                  except
                    on E: Exception do begin
                      if not HandleRunException(E) then begin
                        Terminate;
                        raise;
                      end;
                    end;
                  end;
                end;
              end else begin
                try
                  Run;
                except
                  on E: Exception do begin
                    if not HandleRunException(E) then begin
                      Terminate;
                      raise;
                    end;
                  end;
                end;
              end;
3 окт 19, 16:48    [21986050]     Ответить | Цитировать Сообщить модератору
 Re: TServerSocket и TService  [new]
Василий 2
Member

Откуда:
Сообщений: 801
oklalex
И тут есть очень сильная хотелка - как бы так "собрать" это сообщение в первом вызове OnExecute(), зациклив проверку буфера?

Просто встань на место сервера и посмотри на сообщение с его т.зр. Как ему определить, что клиент отстрелялся с данными?

Либо длина в заголовке, либо сигнатура окончания. Можно еще по таймауту ждать, но это ламерство.
3 окт 19, 17:06    [21986069]     Ответить | Цитировать Сообщить модератору
 Re: TServerSocket и TService  [new]
DmSer
Member

Откуда: Пенза
Сообщений: 915
Можно весь сеанс обмена с сервером организовать в рамках одного вызова OnExecute.
3 окт 19, 17:14    [21986077]     Ответить | Цитировать Сообщить модератору
 Re: TServerSocket и TService  [new]
oklalex
Member

Откуда:
Сообщений: 24
Друзья, всем огромное спасибо за внимание и идеи. Прошу прощения, что сразу не ответил. Проблема решилась, перенес на Indy, в который раз убеждаюсь, что это очень продуманная вещь. Вкратце - проблему нашел и тут выше ее уже примерно озвучивали - множество соединений висит в состоянии Time_Wait, обычный TServerSocket это не переваривает, они "висят вечно" и в итоге все останавливается. При большой нагрузке очень быстро. При переносе на Indy сделал ручную проверку, живое ли соединение, и если нет, отключаю. Кстати, у Indy и на этот счет есть штатное решение - SetKeepAliveValues(). Все принимается в одном вызове OnExecute(), спасибо DmSer огромное за то, что навели на правильную идею и привели прототипы необходимых функций.
При желании, можно 100% подобное реализовать и с TServerSocket, но уже не стал заморачиваться и строить велосипеды
13 окт 19, 22:01    [21993267]     Ответить | Цитировать Сообщить модератору
 Re: TServerSocket и TService  [new]
oklalex
Member

Откуда:
Сообщений: 24
Василий 2
oklalex
И тут есть очень сильная хотелка - как бы так "собрать" это сообщение в первом вызове OnExecute(), зациклив проверку буфера?

Просто встань на место сервера и посмотри на сообщение с его т.зр. Как ему определить, что клиент отстрелялся с данными?

Либо длина в заголовке, либо сигнатура окончания. Можно еще по таймауту ждать, но это ламерство.

Согласен полностью, если бы так было сделано - эта тема бы не возникла ) но клиенты многие написаны не мной и так, как Господь на душу положит ( поэтому пришлось подстроить таймауты и работать в условиях тех ограничений, в которые поставлен (
13 окт 19, 22:07    [21993272]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 2 [3]      все
Все форумы / Delphi Ответить