5

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

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

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

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

我需要一些帮助来优化此代码,以便我的总 CPU 使用率不会持续高。

4

2 回答 2

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.
于 2012-04-18T10:49:15.373 回答
1

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

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

其次,如果您的 TWebBrowser 网页正在访问 Delphi 本机方法作为来自 javascript 的回调,也会导致闪烁。这些回调,如果它们花费很多时间,也总是会导致嵌入式 TWebBrowser 闪烁,即使正在执行的唯一 javascript 是调用 delphi 回调。我正在谈论的技术(回调)记录在这里

于 2012-04-18T18:20:06.433 回答