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

Wil*_*hua 5 delphi optimization delphi-2009 twebbrowser

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

DOMDocument.getElementById(elementID).innerHTML := someValue;
Run Code Online (Sandbox Code Playgroud)

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

SendMessage(WebBrowser.Handle,WM_SETREDRAW,0,0);
Run Code Online (Sandbox Code Playgroud)

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

TLa*_*ama 4

由于您的主要问题是更新频率,那么您需要降低它。为此,您可以简单地存储上次更新 HTML 文档的时间,并在下一次数据更改时检查自该时间以来是否已经过了某个时间段。

下面的代码展示了如何执行此操作。以下示例FUpdatePeriod中的更新周期以毫秒为单位。然后,如果您定期调用UpdateChangesinnerHTML(此处的伪代码)将仅在自上次更改以来至少经过 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.
Run Code Online (Sandbox Code Playgroud)