我多年来一直在使用Indy 10.5和几个旧版本。为了支持HTTP摘要式身份验证,我已经从他们的SVN下载了最新版本。
这是修复我正在使用的HTTP摘要身份验证问题......
问题是自10.6以来所有版本的CPU使用率。
我能够并行创建20个线程来检索HTTP Streams(网络摄像机MJPEG Streams是精确的),并且每个任务使用大约1-3%的cpu,具体取决于分辨率和帧速率。 (包括解析和解码)
我已经清理了我的代码,它通常使用IOHandler,CookieManager并依赖于InternalWork方法,直到我留下最基本的idHttp用法,可能就是:
procedure TForm1.Button1Click(Sender: TObject);
var
HTTPClient : TidHTTP;
begin
HTTPClient := TidHTTP.Create(nil);
HTTPClient.Get('http://plazacam.studentaffairs.duke.edu/axis-cgi/mjpg/video.cgi?resolution=640x480');
HTTPClient.Free();
end;
即使上面的代码没有改变任何设置也消耗了25%的CPU(因此它使我的计算机的核心饱和)。
这是一个无限的流,所以它没有返回到客户端是正常的,但是因为流可能是< 100kb / s,检索它的cpu用法应该接近于零......
我在德语的另一个论坛上看到,添加这个HTTPOptions可以解决高CPU的问题,但在我的情况下它对CPU没有影响: HTTPOptions:= [hoNoParseMetaHTTPEquiv]
我已尝试使用Indy SVN的先前版本,以确保它不是每日构建的特定内容。
XE4,XE5和X6附带的10.6.0版本具有相同的问题,但如果我回滚到: Indy 10.5.5 - RS2010 RTM
然后一切都很好(除了HTTP摘要身份验证),它只使用了大约2%的cpu ......
是否有人遇到过相同的问题并且当前版本的indy使用合理数量的CPU来实现此目的?
谢谢!
答案 0 :(得分:2)
想想你在做什么。您正在调用返回TIdHTTP.Get()
的{{1}}版本,但您正在下载“无限”流。这意味着String
不断地从套接字读取数据并分配越来越多的内存来保存该数据,以期最终将其转换为Get()
。因此,有意义的是CPU使用率可能会随着时间的推移而变高,特别是如果多个线程在多个线程中工作。
作为测试,请尝试告诉String
丢弃它下载的数据而不是在内存中缓冲它,看看CPU使用情况如何:
Get()
HTTPClient.Get('http://plazacam.studentaffairs.duke.edu/axis-cgi/mjpg/video.cgi?resolution=640x480', TStream(nil));
并非真正用于处理“无限”流,除非您提供能够接收“无限”数据的TIdHTTP
(例如TStream
),或启用{ {1}}标记服务器是否使用MIME来传递流数据,在这种情况下,您可以自己阅读流数据,如本博客文章所述: