2009-03-12 9 views
3

TWebBrowserにバックグラウンドスレッドでWebページを読み込むことはできますか?Delphi:TWebBrowser in background-thread

アプリケーションが読み込まれると、WebからページをTWebBrowserにダウンロードしたいのですが、私はGUIスレッドをブロックしたくありません。

提案がありますか?

いくつかの明確化:
ウェブブラウザコンポーネントは、フォーム上に生きている、と私は、Webからページを表示します。しかし、私はバックグラウンドスレッドでそのページをすべてダウンロードしたいので、重いページを読み込んでもGUIスレッドはブロックされません。

私は一般的にスレッドを書くことができると思います。

答えて

9

TWebBrowserすでにが別スレッドにダウンロードされます。あなたのプログラムは、ダウンロード中にすでに反応しているはずです。頻出パターンは、URLを設定し、ダウンロードが完了するのを待つことであるので、あなたはこれを見ることができます:

ProcessMessages使用していますので、私は誠意を持って、それをお勧めすることはできません
WebBrowser1.Navigate(...); 
while WebBrowser1.Busy do 
    Application.ProcessMessages; 

。コードのようにポーリングするのではなく、ダウンロードが完了したときに通知を受けるには、コントロールのOnNavigateComplete2イベントを処理します。メインページだけでなく、フレームでもイベントが発生する可能性があることに注意してください。

あなたは表示ページにしたい場合は、VCLを使用し、他のコントロールと同じルールに該当するので、その後、あなたのTWebBrowser制御はとにかく別のスレッドであってはなりません。コントロールをにダウンロードするだけの場合は、TWebBrowserが過剰である可能性があります。をダウンロードしてください。 Indy、またはオペレーティングシステムに組み込まれているファイルダウンロード機能を使用することができます。それらは別のスレッドで簡単に使用できます。

+0

これは意味があります。私のアプリケーションは数秒間停止していますが、別の理由を見つけなければならないと思います。 – Vegar

+1

一般的な考え方は良いです。ビジー状態のReadyStateを使用するだけです。詳細は私のコメントを参照してください.. –

1

似たような試みは一度もしていませんが、私はあなたが問題に遭遇すると思います。

メッセージループを実装し、そのスレッドのウィンドウのメッセージを処理する複数のスレッドを1つのプロセスに含めることができますが、すべてのウィンドウはそれらを作成したスレッドに関連付けられます。 Windowsメッセージは、ウィンドウが作成されたスレッドで常に処理されます。したがって、別のスレッドから組み込みのTWebBrowserコントロールからメソッドを呼び出すことができるかもしれませんが、Webブラウザウィンドウにメッセージを送信する必要があります。あなたのGUIスレッドで処理されます。

詳細については、Threading in COMに関するウィキペディアの記事と、this oneのようなSTAについてのRaymond Chenのブログ記事を参照してください。

3

私は同じものが必要でした(ページの自動スクリーンショットを作るために)、私はRobのコードを使い始めました。 ロード中のページでは動作しませんでした。ビジーフラグが設定されていない半分の時間は、ページがまだ完了していないことがはっきりしています。いくつかの研究の後

、これが動作するように見えた:

readyStateのは、次のいずれかである
while (webBrowser1.ReadyState <> READYSTATE_COMPLETE) do 
    Application.ProcessMessages; 

:readyStateのを使用する

const READYSTATE_UNINITIALIZED = 0; // Default initialisation state. 
const READYSTATE_LOADING = 1; // Object is currently loading data. 
const READYSTATE_LOADED = 2; // Object has been initialised. 
const READYSTATE_INTERACTIVE = 3; // User can interact with the object but loading has not yet finished. 
const READYSTATE_COMPLETE = 4; // All of the object's data has been loaded. 

アイデアはここから来た: http://gaskell.org/making-the-webbrowser-control-synchronous/

読み値デルファイ定数は、frここでは: http://www.cryer.co.uk/brian/delphi/twebbrowser/twebbrowser_properties.htm