2012-03-01 7 views
21

Googleマップを表示するにはTWebBrowserを使用します。問題は、マップをロードしている間、メインUIスレッドをブロックすることです。別のスレッドで地図を更新することは可能ですか?別のスレッドでTWebBrowserを更新しますか?

編集: RRUZあなたは正しいです。TWebBrowserにURLの非同期読み込みがあります。

if WaitWhileProcessing and (MapQueryResult.Count > 0) then 
    Result := MapQueryResult[0] as TMapQuery; 

と方法:

function TMapItemCollection.WaitWhileProcessing: Boolean; 
var 
    vMaxSleepCnt: Integer; 
begin 
    Result := True; 
    vMaxSleepCnt := 0; 
    while Processing or Loading do 
    begin 
    inc(vMaxSleepCnt); 
    Application.ProcessMessages; 
    Sleep(100); 
    if vMaxSleepCnt = 100 then 
    begin 
     Result := False; 
     Break; 
    end; 
    end; 
end; 

だから、コードをリファクタリングする必要があり、これを修正するようだ しかし、私はそれブロック コールなぜ問題を発見しました。しかし、これはこの質問の範囲ではありません。

+3

マップがロードされている間にGUIがフリーズするのは確かですか? TWebBrowserは非同期に動作するためです。あなたはマップをロードするために使用しているコードを表示できますか? – RRUZ

+0

www.bsalsa.comからTEmbeddedWBで試しましたか?それはすでに解決策があるかもしれませんし、それに切り替えて非同期の負荷が働くのはかなり簡単です。 –

+0

RRUZとWarrenPの両方の提案に感謝します。 RRUZは、すでにTWebBrowserで非同期読み込みが行われているということです。だから私の場合、理由は別のものです。コードがかなり複雑であるため、調査する必要があります... –

答えて

3

ifステートメントが実行され、条件を評価するためにWaitWhileProcessingを呼び出すと、10回目の睡眠で100回ループします。しかし、ProcessMessagesを呼び出すときにどのようなメッセージが待っていますか?このメソッドを再帰的に呼び出すことはできますか?それは決して眠りませんが、この方法を続けています。私はまた、他のいくつかのマイナーなものを変更見ることができるように

var 
    isWaitWhileProcessingBusy :boolean = false; 

function TMapItemCollection.WaitWhileProcessing: Boolean; 
var 
vSleepCnt: Integer; 
begin  
    if not isWaitWhileProcessingBusy then 
    begin 
    isWaitWhileProcessingBusy = true; 
    vSleepCnt := 0; 
    while Processing or Loading or vSleepCnt < 100 do 
    begin 
     inc(vSleepCnt); 
     Application.ProcessMessages; 
     Sleep(100); 
    end; 
    isWaitWhileProcessingBusy := false; 
    end; 
    Result = Processing or Loading; 
end; 

:ところで、ProcessMessagesは本当に悪い習慣ですが、今のところ...これを試していることに注意してください。ブレークはwhile条件ではなく、結果は単純にProcessingまたはLoadingの結果である(その式が実際の結果を与えるため)。関数の外側にある余分なisWaitWhileProcessingBusyは、メッセージループが再入力されないようにします。うまくいけば、それはユーザーインターフェースのロックを防ぐでしょう。これはベストプラクティスではありませんが、今のところ解決するのに役立ち、問題を特定するのに役立ちます。

Loading/Processingをポーリングする理由はありますか? TWebBrowserのOnDocumentCompleteイベントを使用する方がずっと簡単でしょうか?

...別の考えが私の頭を越えた...あなたはタスクマネージャをチェックしましたか? Googleマップでは、主UIスレッドを使用するactivexコンポーネントであるFlashも使用されています。これは飢餓の原因となる資源豚でもあります。

幸運!

関連する問題