【发布时间】:2011-05-08 22:14:23
【问题描述】:
编辑 将其缩小到这一行,
HTML := wb.OleObject.Document.documentElement.innerHTML;
消耗时间...如何加快速度?
使用以下代码,我的应用程序在尝试访问页面的 HTML (Delphi XE) 时可能会挂起 1-2 秒。
function Button1Click(Sender : TObject);
begin
wb.navigate('http://10.0.0.154/stats');
// Use a timer to poll the page - dont wait and process app messages
timer1.enabled := true;
end;
procedure Timer1Timer(Sender : TObject);
var
HTML : WideString;
begin
If GetHTML(HTML) = true then
begin
Timer1.enabled := false;
{ do something }
end;
end;
function GetHTML(var HTML : WideString) : boolean;
var
Document : IHTMLDocument2;
begin
HTML := '';
Result := false;
Document := wb.DOcument as IHTMLDocument2;
If Assigned(Document) then
begin
try
HTML := wb.OleObject.Document.documentElement.innerHTML;
Result := true;
except
Result := false;
end;
end;
end;
但是我注意到在我的 GetHTML 方法中可能需要 1-2 秒才能返回某些内容,并且它会锁定 UI。用 Delphi XE 查看 AQTime,它说方法调用很慢(1-2 秒)。它是零星的,我想知道当页面仍在加载中时它是否会失败。
我正在加载的页面是一个内部页面,充满了 javascript 和 500k 大,我不能使用 OnDocumentComplete 因为它在页面准备好之前触发,即使我检查 ReadyState 它仍然会触发早点。
谁能解释一下,如果他们有更快的方法可以访问 TWebbrowser 的 HTML?
【问题讨论】:
-
wb.Navigate 立即返回,因此不是应用程序挂起的原因。 TWebBrowser 必须下载页面,然后将其呈现以显示,这就是获取 HTML 的延迟发生的地方。如果您想要的只是原始 HTML,为什么不使用 Indy、ICS 或 TDownLoadURL(标准操作)?
-
一旦 javascript 完成处理,我就在 HTML 之后,javascript 也是我需要使用 TWebbrowser 的原因,因为 Indy、ICS 等不会运行 javascript。
-
您是否尝试使用
outerHtml而不是innerHtml?也许它会有所作为。此外,如果您托管 TWebBrowser 控件,使用 FEATURE_BROWSER_EMULATION 强制 TWebBrowser 使用最新版本进行显示可能会有所帮助(撰写本文时为 9;托管控件的默认模式为 7)。也许这有速度优势,虽然我没有测试。
标签: delphi profiling delphi-xe twebbrowser