9

我使用的是 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 秒。

我以为这些组件是多线程的?是否有一些属性我可以设置以使其按照我认为的方式运行(两个请求都会立即得到答复)。

4

3 回答 3

11

不是 Indy,并且TIdHTTPServer对这种行为负责!是浏览器!

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

因此,Firefox 对同一个 URI 的 2 个请求进行序列化。同时打开 2 个不同的浏览器(例如 IE 和 Firefox),http://localhost/在这两个浏览器中请求,你会得到预期的结果。

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

于 2009-04-17T23:45:02.843 回答
1

我使用过 Indy 10 idHTTPServer,它多线程的。阻止您的应用程序的可能是“哔”或“睡眠”命令。因为虽然组件是多线程的,但是有些命令可能还是会锁住整个进程。

于 2009-04-17T18:17:50.650 回答
1

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;
于 2018-04-25T03:14:26.700 回答