2012-03-01 16 views
21

मैं Google मानचित्र दिखाने के लिए एक TWebBrowser का उपयोग करता हूं। समस्या यह है कि यह मुख्य यूई धागा को ब्लॉक करता है जबकि यह नक्शा लोड करता है। क्या नक्शा को एक अलग थ्रेड में अपडेट करना संभव है?एक अलग धागे में TWebBrowser अद्यतन करें?

संपादित करें: RRUZ आप सही हैं TWebBrowser को URL के लिए async लोडिंग है। लेकिन मैं समस्या पाया कारण है कि यह ब्लॉक कॉल:

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

क्या आप सुनिश्चित हैं कि मानचित्र लोड होने पर जीयूआई फ्रीज कौन सा है? क्योंकि TWebBrowser असीमित रूप से कार्य करता है। क्या आप नक्शा लोड करने के लिए उपयोग कर रहे कोड को दिखा सकते हैं? – RRUZ

+0

क्या आपने इसे www.bsalsa.com से TEmbeddedWB के साथ आजमाया है? इसमें पहले से ही एक समाधान हो सकता है, और इसे स्विच करने के लिए बहुत आसान हो सकता है और एसिंक लोड काम कर रहा है। –

+0

आरआरयूजेड और वॉरेनपी दोनों के सुझावों के लिए धन्यवाद। आरआरयूजेड सही है कि यह पहले से ही TWebBrowser में लोड हो रहा है। तो मेरे मामले में कारण कुछ और है। मुझे जांच करनी है क्योंकि कोड बल्कि जटिल है ... –

उत्तर

3

जब if स्टेटमेंट निष्पादित किया जाता है और स्थिति का मूल्यांकन करने के लिए प्रतीक्षा WhileProcessing को कॉल करता है, तो यह दूसरी नींद के 10 वें स्थान के साथ 100 गुना लूप करता है। लेकिन ProcessMessages को कॉल करते समय कौन से संदेश प्रतीक्षा कर रहे हैं? क्या विधि को फिर से बुलाया जा सकता है? यह कभी नींद नहीं लेगा लेकिन इस विधि का आह्वान करता रहता है। वैसे, ध्यान रखें कि 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; 

। ब्रेक थोड़ी देर की स्थिति में नहीं है और परिणाम केवल प्रसंस्करण या लोडिंग का परिणाम है (क्योंकि वह अभिव्यक्ति वास्तविक परिणाम देती है)। फ़ंक्शन के बाहर अतिरिक्त isWaitWhileProcessingBusy संदेश लूप को फिर से दर्ज करने से रोकता है। उम्मीद है कि उपयोगकर्ता इंटरफ़ेस को लॉक करना बंद कर देगा। यह भी सबसे अच्छा अभ्यास नहीं है लेकिन अभी के लिए यह हल करने में मदद कर सकता है और इसके साथ समस्या को इंगित करता है।

क्या कोई कारण है कि आप मतदान लोडिंग/प्रसंस्करण क्यों करते हैं? TWebBrowser के OnDocumentComplete ईवेंट का उपयोग करना अधिक आसान नहीं होगा?

... और एक और विचार मेरे दिमाग को पार कर गया ... क्या आपने कार्य प्रबंधक की जांच की है? गूगल मैप्स फ्लैश का उपयोग कर रहा है, मुख्य यूआई थ्रेड का उपयोग कर एक सक्रिय घटक भी। यह भुखमरी के कारण संसाधन हॉग भी हो सकता है।

शुभकामनाएं!

संबंधित मुद्दे