德尔福/印IdHttpServer不是多线程?
-
11-09-2019 - |
题
我使用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和它的是多线程。是什么阻止你的应用程序可能是“嘟嘟”或“休眠”命令。因为虽然组分是多线程,一些命令可能仍然锁定的全过程。
不隶属于 StackOverflow