Delphi / Indy IdHttpServer没有多线程?

时间:2009-04-17 18:14:27

标签: multithreading delphi http indy

我正在使用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秒钟。

然后我使用2个浏览器测试Firefox。我有第一个连接到“localhost”,我立刻听到一声哔哔声。然后我选择第二个浏览器,并将其连接到localhost(在不到10秒的时间内),但它不会立即发出哔声。它等待第一个请求完成,然后发出蜂鸣声,并等待另外10秒。

我认为这些组件是多线程的?是否有一些我可以设置的属性使其表现得像我想象的那样(两个请求都会立即得到回答)。

3 个答案:

答案 0 :(得分:11)

Not Indy,TIdHTTPServer对此行为负责!这是webbrowser!

Firefox在同一台服务器上共享不同请求的TCP连接。

因此,Firefox序列化了对同一URI的2个请求。同时打开2个不同的浏览器(例如IE和Firefox),在两者中请求http://localhost/,您将获得预期的结果。

回答你的问题:是的,当然,每个TIdHTTPServer.OnCommandGet事件都在一个自己的“调度程序”线程中执行,并且可以同时执行。

答案 1 :(得分:1)

GUI在此10秒内响应,因此它是multiThreaded 长期运营 把你的代码放到另一个线程中 - 你会得到你想要的东西

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;

答案 2 :(得分:0)

我使用了Indy 10 idHTTPServer, 多线程。什么阻止你的应用程序可能是“哔”或“睡眠”命令。因为虽然组件是多线程的,但某些命令仍然可能锁定整个过程。