编辑 范围缩小到这个1号线,申请锁在尝试访问TWebbrowsers HTML
HTML := wb.OleObject.Document.documentElement.innerHTML;
消耗的时间......这怎么可能加速?
使用下面的代码我的应用程序可能会挂起1-2秒,而它试图访问页面的HTML(Delphi XE)。
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秒返回的东西,它锁定的用户界面。用Delphi XE来看AQTime,它说方法调用很慢(1-2秒)。这是spotered,我不知道当页面仍然是中等负载时它是否失败。
我正在加载的页面是一个内部页面,完整的JavaScript和500k大,我不能使用OnDocumentComplete,因为它在页面甚至准备好之前触发,即使我在ReadyState上检查它仍然会触发提前。
任何人都可以摆脱一些光,如果他们更快的方式,我可以访问TWebbrowser的HTML?
wb.Navigate立即返回,所以它不是应用程序挂的原因。 TWebBrowser必须下载页面,然后渲染它才能显示,这就是获取HTML的延迟。如果你想要的只是原始HTML,为什么不使用Indy,ICS或TDownLoadURL(标准动作)? – crefird 2011-05-09 15:11:36
我一旦JavaScript完成处理后的HTML,JavaScript也是为什么我需要使用TWebbrowser,因为Indy,ICS等不会运行JavaScript。 – Wizzard 2011-05-09 22:18:51
您是否尝试使用'outerHtml'而不是'innerHtml'?也许它有所作为。此外,如果您正在托管TWebBrowser控件,可能有助于使用FEATURE_BROWSER_EMULATION来强制TWebBrowser使用最新版本进行显示(截至撰写本文时为止;托管控件的默认模式为7)。虽然我没有测试,但也许在这方面有速度优势。 – 2011-07-22 08:06:57