5

TWebBrowerHTML ドキュメントをロードするコンポーネントを含むフォームがあります。HTML ドキュメントのデータは数秒ごとに更新され、1 秒ごとに複数回更新されることもあります。Delphi の値を次のように更新します。

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

問題は、すべての更新が完了するまで、ウィンドウ/Web ブラウザーをロックして、ペイント/更新できないようにすることです。これを行う方法はありますか?に電話しますか

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 を書き直して Web ページがちらつかないようにする以外に、HTML レイアウトにアクティブな要素がないため (100% JavaScript フリー = ちらつきなし)、唯一の解決策は Internet Explorer の使用を停止することです。 、したがって TWebbrowser の使用を停止します。

次に、TWebBrowser Web ページが JavaScript からのコールバックとして Delphi ネイティブ メソッドにアクセスしている場合にも、ちらつきが発生する可能性があります。これらのコールバックに時間がかかると、実行されている唯一の JavaScript が Delphi コールバックの呼び出しであっても、組み込みの TWebBrowser で常にちらつきが発生します。私が話しているテクニック (コールバック) は、ここに文書化されています。

于 2012-04-18T18:20:06.433 に答える