Delphi / Indy IdHttpServer не многопоточный? - PullRequest
9 голосов
/ 17 апреля 2009

Я использую Delphi 2006 и Indy 10. Я создаю форму и раскрываю компонент IdHttpServer. Я создаю событие OnCreate для формы, чтобы установить сервер активным, и я ввожу эти строки для OnCommandGet сервера:

procedure TForm3.IdHTTPServerCommandGet(AContext: TIdContext;
  ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
begin
   Beep;
   Sleep(10000);
   AResponseInfo.ContentText := DateTimeToStr(Now);
end;

Обратите внимание на сон в течение 10 секунд.

Затем я тестирую с Firefox, используя 2 браузера. У меня есть первая связь с "localhost", и я сразу же слышу звуковой сигнал. Затем я переключаюсь на второй браузер и подключаю его к локальному хосту (менее чем за 10 секунд), но он сразу не подает звуковой сигнал. Он ожидает завершения первого запроса, затем подает звуковой сигнал и ждет еще 10 секунд.

Я думал, что эти компоненты были многопоточными? Есть ли какое-либо свойство, которое я могу установить, чтобы заставить его вести себя так, как я думал (оба запроса будут даны сразу же).

Ответы [ 3 ]

11 голосов
/ 18 апреля 2009

Not Indy и TIdHTTPServer несет ответственность за это поведение! Это веб-браузер!

Firefox совместно использует TCP-соединение для разных запросов на одном сервере.

Итак, Firefox сериализует 2 запроса на один и тот же URI. Откройте 2 разных браузера одновременно (например, IE и Firefox), запросите http://localhost/ в обоих, и вы получите ожидаемый результат.

И ответ на ваш вопрос: Да, конечно, каждое TIdHTTPServer.OnCommandGet событие выполняется в собственном потоке «планировщика» и может выполняться одновременно.

1 голос
/ 25 апреля 2018

GUI реагирует в течение этих 10 секунд, поэтому он является многопоточным для длительных операций поместите свой код в другой поток - и вы получите то, что хотите

unit uSomeThread;

interface

uses
  System.Classes;

type
  TSomeThread = class(TThread)
  protected
    procedure Execute; override;
  end;

implementation


procedure TSomeThread.Execute;
begin
  //  Beep;
  Sleep(10000);
end;

end.

...........

    procedure TServer.IdHTTPServerCommandGet(AContext: TIdContext; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
var
  cContext: TClientContext;
  t: TSomeThread;
begin
//  Beep;
//  Sleep(10000);

  t := TSomeThread.Create(true);
  t.FreeOnTerminate := true;
  t.Start;

  AResponseInfo.ResponseNo := 200;
  AResponseInfo.CacheControl := 'no-cache';
  AResponseInfo.CustomHeaders.Add('Access-Control-Allow-Origin: *');
  AResponseInfo.ContentText := 'ok';
  AResponseInfo.ResponseNo := 200;
  AResponseInfo.WriteContent;
  Beep;

end;
0 голосов
/ 17 апреля 2009

Я использовал Indy 10 idHTTPServer, и он является многопоточным. То, что блокирует ваше приложение, может быть командой «beep» или «sleep». Поскольку компонент является многопоточным, некоторые команды могут блокировать весь процесс.

...