2012-04-18 16 views
5

HTMLドキュメントをロードするTWebBrowerコンポーネントがあるフォームがあります。 HTMLドキュメントのデータは毎秒数秒ごとに、時には複数回更新され、私が使用してDelphiで値を更新:TWebBrowserのペイントを最適化して合計CPU使用量を減らす

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

問題、私は絵からそれを防ぐために、ウィンドウ/ウェブブラウザをロックしたいです/すべての更新が完了するまで更新する。これを行う方法はありますか?

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

このコードを最適化して、CPU使用率が連続的に高くならないように助けてください。

+0

'IViewObject'インタフェースには、これに便利な' Freeze'と 'UnFreeze'関数があります。私は例を用意しようとします。 – TLama

+0

私はここで実際のコード(HTMLを含む)を見る必要があると思います。 'WM_SETREDRAW'は実際に動作します(私が作った非常に限られたテストで)。 'innerHTML'は非同期的に動作するので、それを同期させるのが問題になると思います。 – kobik

+0

@kobikしかし、' innerHTML'が非同期であると言うと 'IViewObject'でも助けになるのではないかと心配です。それは準備が整った状態のためのいくつかのチェックでなければなりません。 – TLama

答えて

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. 
+0

この解決に感謝します。 –

1

これは横向きの回答です。しかし、TWebBrowserでちらつき問題が発生したときは、アプリケーションにGoogle Chrome (DCEF) embeddedを使用するように切り替えて修正しました。

私はあまりにも私がTWebBrowserを "最適化"できて、ちらつきを減らすことができたと感じましたが、問題はInternet Explorerのネイティブであることがわかりました。新しいバージョンのInternet Explorerをインストールするか、JavaScriptをすべて書き直してWebページがちらつくことはありません.HTMLレイアウトにはアクティブな要素がないので(100%javascriptがない=ちらつきはありません)、唯一の修正はInternet Explorerの使用を止めることですTWebbrowserの使用を停止します。

第2に、TWebBrowser WebページがJavaScriptのコールバックとしてDelphiのネイティブメソッドにアクセスしている場合にも、フリッカーが発生する可能性があります。これらのコールバックは、実行中の唯一のjavascriptがdelphiコールバックの呼び出しであっても、多くの時間がかかると、組み込みのTWebBrowserでも常にちらつきを引き起こします。私が話している技術(コールバック)はhereと書かれています。

+0

P、私の質問はあまりにも曖昧すぎるかもしれません。私はちらつきの問題はありません。私の最大の関心事は、innerHTMLを呼び出すときにwebbrowserが多くのCPUパワーを吸い込み、ペイントする前にinnerHTMLへのすべての呼び出しを終了したいということです。ありがとう –

+0

私はGoogleのクロムを使用して、改善が起こるかどうかを見てみましょう。おかげで –

+1

あなたの質問を編集します。あなたは本当にYを意味するときにXについての質問をするべきではありません:-) –

関連する問題