我使用2006 Delphi和印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秒。

我认为这些组分的多线程?有一些属性,我可以设置为使其行为我以为这样它会(这两个请求将立即得到回答)。

有帮助吗?

解决方案

不印和TIdHTTPServer负责这种行为!这是web浏览器!

火狐共享在同一服务器的不同请求的TCP连接。

因此,火狐序列化对于相同URI的2个请求。开2个不同的浏览器在同一时间(例如,IE和Firefox),请求http://localhost/在两个和你将得到预期的结果。

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

其他提示

GUI是这十秒钟内响应,所以它是多线程 长期操作 把你的代码放到另一个线程 - 你会得到你想要的东西。

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;

我已经使用印10 idHTTPServer和它的多线程。是什么阻止你的应用程序可能是“嘟嘟”或“休眠”命令。因为虽然组分是多线程,一些命令可能仍然锁定的全过程。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top