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

Delphi 优化TWebBrowser的绘制以减少总CPU使用量,delphi,optimization,delphi-2009,twebbrowser,Delphi,Optimization,Delphi 2009,Twebbrowser,我有一个表单,它有一个加载HTML文档的twebrower组件。HTML文档上的数据每隔几秒钟更新一次,有时每秒更新多次,我使用以下方法更新Delphi中的值: DOMDocument.getElementById(elementID).innerHTML := someValue; 问题是我想锁定窗口/网络浏览器,以防止它在所有更新完成之前进行绘制/更新。有没有办法做到这一点?你要打电话给我吗 SendMessage(WebBrowser.Handle,WM_SETREDRAW,0,0);

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

DOMDocument.getElementById(elementID).innerHTML := someValue;
问题是我想锁定窗口/网络浏览器,以防止它在所有更新完成之前进行绘制/更新。有没有办法做到这一点?你要打电话给我吗

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

我需要一些帮助来优化这段代码,这样我的CPU总使用率就不会一直很高。

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

这是一个侧面的回答;但是当TWebBrowser出现闪烁问题时,我们通过切换到应用程序中使用来修复它们

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


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

IViewObject
接口具有
Freeze
UnFreeze
功能,可能对这一点很有用。我将尝试准备一个示例,我认为我们需要在这里看到真实的代码(包括HTML)
WM_SETREDRAW
实际上有效(在我做的一个非常有限的测试中)。但是由于
innerHTML
是异步工作的,我认为同步它会有问题…@kobik,但是如果你说
innerHTML
是异步的,那么我恐怕就连
IViewObject
也帮不上忙了。必须对就绪状态进行一些检查。@TLama,谢谢,我将等待您准备的示例。您所说的“如果我在这里发布代码,时间会很长”是什么意思?那就把它寄到别的地方吧。如果您需要帮助,我们需要能够重现问题。或者提供另一个较小的代码来说明您所说的内容。你的问题很模糊。P,我的问题可能有点模糊。我没有闪烁问题,我最担心的是,当我调用innerHTML时,webbrowser会占用大量cpu资源,并且希望在绘制它之前完成对innerHTML的所有调用。谢谢,我会考虑使用谷歌浏览器,看看是否会有改进。谢谢,那我就编辑你的问题。当你真正指的是Y时,你不应该问关于X的问题