2012-04-18 6 views
5

मेरे पास एक ऐसा फॉर्म है जिसमें TWebBrower घटक है जो एक HTML दस्तावेज़ लोड करता है। HTML दस्तावेज़ पर डेटा हर दूसरे हर कुछ सेकंड, कभी कभी एक से अधिक बार अद्यतन किया जाता है और मैं का उपयोग कर डेल्फी में मान अपडेट:कुल CPU उपयोग को कम करने के लिए TWebBrowser की पेंटिंग अनुकूलित करें

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

समस्या मैं खिड़की/webbrowser यह पेंटिंग से रोकने के लिए लॉक करना चाहते है/अपडेट होने तक मेरे सभी अपडेट पूर्ण हो जाते हैं। क्या इसे करने का कोई तरीका है?

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

के लिए एक कॉल मैं इस कोड के अनुकूलन में कुछ मदद करना चाहते हैं, ताकि मेरी कुल CPU उपयोग लगातार उच्च नहीं है।

+0

'IViewObject' इंटरफ़ेस में 'फ्रीज' और' अनफ्रीज़ 'फ़ंक्शन हैं जो इसके लिए उपयोगी हो सकते हैं। मैं एक उदाहरण तैयार करने की कोशिश करूंगा। – TLama

+0

मुझे लगता है कि हमें यहां वास्तविक कोड (HTML सहित) देखने की आवश्यकता है। 'WM_SETREDRAW' वास्तव में काम करता है (मैंने बनाए गए बहुत सीमित परीक्षण में)। लेकिन चूंकि 'आंतरिक HTML' असीमित रूप से काम करता है, मुझे लगता है कि इसे सिंक्रनाइज़ करने में समस्या होगी ... – kobik

+0

@ कोबिक, लेकिन यदि आप कहते हैं कि 'आंतरिक HTML' असीमित है तो मुझे डर है कि 'IViewObject' भी मदद नहीं करता है। इसे तैयार राज्य के लिए कुछ जांच करनी होगी। – TLama

उत्तर

4

चूंकि आपकी मुख्य समस्या आवृत्ति अद्यतन है, तो आपको इसे कम करने की आवश्यकता है। इसके लिए आप आखिरी बार स्टोर कर सकते हैं जब आपने एचटीएमएल दस्तावेज़ अपडेट किया है और अगले डेटा में परिवर्तन करें कि उस समय से एक निश्चित अवधि समाप्त हो गई है या नहीं।

यहां कोड है जो दिखाता है कि यह कैसे करें। निम्नलिखित उदाहरण में 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 को "अनुकूलित" कर सकता हूं, और इसे झिलमिलाहट कम कर सकता हूं, मुझे पता चला कि समस्या इंटरनेट एक्सप्लोरर के लिए मूल है। इंटरनेट एक्सप्लोरर का एक नया संस्करण स्थापित करने के अलावा, या अपनी सभी जावास्क्रिप्ट को फिर से लिखना, इसलिए आपका वेब पेज कभी भी झिलमिलाहट नहीं करता है, क्योंकि इसमें HTML लेआउट (100% जावास्क्रिप्ट फ्री = नो फ़्लिकर) में कोई सक्रिय तत्व नहीं है, केवल एक ही फिक्स्ड इंटरनेट एक्सप्लोरर का उपयोग करना बंद करना है , और इस प्रकार TWebbrowser का उपयोग बंद करो।

दूसरा, झिलमिलाहट वेब पेज जावास्क्रिप्ट से कॉलबैक के रूप में डेल्फी देशी विधियों तक पहुंचने पर भी हो सकता है। इन कॉलबैक, यदि वे बहुत समय लेते हैं, तो हमेशा एम्बेडेड TWebBrowser में झिलमिलाहट का कारण बनेंगे, भले ही निष्पादित किया जा रहा एकमात्र जावास्क्रिप्ट डेल्फी कॉलबैक का आविष्कार है। जिस तकनीक के बारे में मैं बात कर रहा हूं (कॉलबैक) को here दस्तावेज किया गया है।

+0

पी, मेरा प्रश्न थोड़ा अस्पष्ट हो सकता है। मेरे पास झिलमिलाहट के मुद्दे नहीं हैं, मेरी सबसे बड़ी चिंता यह है कि जब मैं आंतरिक HTML को कॉल कर रहा हूं तो वेबब्रोसर बहुत सीपीयू शक्ति को बेकार करता है और इसे चित्रित करने से पहले आंतरिक कॉलम में सभी कॉल को समाप्त करना चाहता है। धन्यवाद –

+0

मैं Google क्रोम का उपयोग करने पर विचार करूंगा और देख सकता हूं कि कोई सुधार होने जा रहा है या नहीं। धन्यवाद –

+1

मैं तब आपका प्रश्न संपादित करने जा रहा हूं। आपको एक्स के बारे में कोई सवाल नहीं पूछना चाहिए जब आप वास्तव में वाई का मतलब है :-) –

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