我正在使用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秒。
我认为这些组件是多线程的?是否有一些我可以设置的属性使其表现得像我想象的那样(两个请求都会立即得到回答)。
答案 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, 多线程。什么阻止你的应用程序可能是“哔”或“睡眠”命令。因为虽然组件是多线程的,但某些命令仍然可能锁定整个过程。