优化TWebBrowser的绘制以减少总CPU使用率

时间:2012-04-18 09:57:00

标签: delphi optimization delphi-2009 twebbrowser

我有一个包含TWebBrower组件的表单,用于加载HTML文档。 HTML文档上的数据每隔几秒更新一次,有时每秒更新一次,我使用以下命令更新Delphi中的值:

DOMDocument.getElementById(elementID).innerHTML := someValue;

问题是我想锁定窗口/ webbrowser以防止它绘制/更新,直到我的所有更新都完成。有没有办法做到这一点?请致电

SendMessage(WebBrowser.Handle,WM_SETREDRAW,0,0);

我希望在优化此代码方面提供一些帮助,以便我的总CPU使用率不会持续很高。

2 个答案:

答案 0 :(得分:4)

由于您的主要问题是更新频率,因此您需要减少它。为此,您只需存储上次更新HTML文档的时间,并在下次数据更改时检查自该时间段后是否经过了一段时间。

以下是显示如何执行此操作的代码。以下示例中的FUpdatePeriod是更新周期(以毫秒为单位)。然后,如果您定期调用UpdateChanges,则innerHTML(此处为伪代码)仅在自上次更改后至少经过1000毫秒时才会更新。

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, MSHTML, OleCtrls, SHDocVw;

type
  TForm1 = class(TForm)
    WebBrowser1: TWebBrowser;
    procedure FormCreate(Sender: TObject);
  private
    FLastUpdate: Cardinal;
    FUpdatePeriod: Cardinal;
    procedure UpdateChanges(const AData: WideString);
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  FUpdatePeriod := 1000;
end;

procedure TForm1.UpdateChanges(const AData: WideString);
begin
  if (GetTickCount - FLastUpdate > FUpdatePeriod) then
  begin
    (WebBrowser1.Document as IHTMLDocument2).body.innerHTML := AData;
    FLastUpdate := GetTickCount;
  end;
end;

// now remains to call the UpdateChanges periodically

end.

答案 1 :(得分:1)

这是一个侧面的答案;但是当我们遇到TWebBrowser的闪烁问题时,我们通过切换到使用Google Chrome (DCEF) embedded来修复它们。

虽然我最初觉得我可以“优化”TWebBrowser并减少它的闪烁,但我发现问题只是Internet Explorer本身的问题。除了安装新版本的Internet Explorer,或重写所有JavaScript,因此您的网页永远不会闪烁,因为它在HTML布局中没有活动元素(100%javascript free = no flicker)唯一的解决方法是停止使用Internet Explorer ,因此停止使用TWebbrowser。

其次,如果您的TWebBrowser网页从javascript中回访Delphi本机方法作为回调,也可能导致闪烁。这些回调,如果花费大量时间,也会在嵌入式TWebBrowser中引起闪烁,即使正在执行的唯一javascript是delphi回调的调用。我所谈论的技术(回调)记录在案here