【问题标题】:Optimize painting of TWebBrowser to reduce total CPU usage优化 TWebBrowser 的绘制以减少总 CPU 使用率
【发布时间】:2012-04-18 09:56:59
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • IViewObject 接口具有可能对此有用的 FreezeUnFreeze 函数。我会试着准备一个例子。
  • 我认为我们需要在这里看到真实的代码(包括 HTML)。 WM_SETREDRAW 确实有效(在我进行的非常有限的测试中)。但是由于innerHTML是异步工作的,所以我认为同步它会是一个问题......
  • @kobik,但如果你说innerHTML 是异步的,那么恐怕即使@9​​87654330@ 也无济于事。必须对就绪状态进行一些检查。
  • @TLama,谢谢,我会等待你准备的样本。
  • “如果我在这里发布代码会很长”是什么意思?然后把它贴在别的地方。如果您需要帮助,我们需要能够重现问题。或提供另一个较小的代码来说明您所说的内容。你的问题很模糊。

标签: delphi optimization delphi-2009 twebbrowser


【解决方案1】:

由于您的主要问题是更新频率,因此您需要降低它。为此,您可以简单地存储上次更新 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.

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • P,我的问题可能有点太模糊了。我没有闪烁问题,我最担心的是,当我调用 innerHTML 时,webbrowser 会消耗大量的 cpu 功率,并且希望在绘制它之前完成对 innerHTML 的所有调用。谢谢
    • 我会考虑使用谷歌浏览器,看看是否会有改进。谢谢
    • 那么我将编辑您的问题。当你真正的意思是 Y 时,你不应该问关于 X 的问题。:-)
    猜你喜欢
    • 1970-01-01
    • 2013-06-01
    • 2015-08-02
    • 1970-01-01
    • 2013-12-05
    • 1970-01-01
    • 1970-01-01
    • 2015-04-14
    • 1970-01-01
    相关资源
    最近更新 更多