2008-10-08 13 views
9

में प्रपत्र अद्यतन परिणामों मुझे लगता है कि मैं सी # में लिखा है एक .net अनुप्रयोग है। कुछ रूपों पर मैं अक्सर प्रदर्शन फ़ील्ड अपडेट करता हूं। कुछ मामलों में फॉर्म (टेक्स्टबॉक्स, लेबल, पिक्चरबॉक्स, आदि) पर प्रत्येक फ़ील्ड का मूल्य बदल गया है। इसके अलावा परिवर्तन की आवृत्ति संभवतः हर सेकेंड हो सकती है। हालांकि, वर्तमान में फॉर्म अपडेट होने पर हर समय एक भयानक झिलमिलाहट होती है। मैं झटके को कैसे रोक सकता हूं? क्या डबल बफर शायद कोई रास्ता है? कृपया सहायता कीजिए!विजुअल C# अस्थिर

उत्तर

1

आप यह अच्छी तरह से अनुसंधान नहीं किया। प्रत्येक फॉर्म में एक डबल बुफर्ड संपत्ति है। इसे सही करने की कोशिश करें। यदि आपने फॉर्म पेंटिंग पर कुछ भी अधिभारित नहीं किया है, तो सब कुछ काम करना चाहिए।

+0

धन्यवाद! मैंने उम्र तलाशने में व्यतीत किया है और यह हर समय मेरे सामने बैठा था। – GrandMasterFlush

7

संक्षिप्त उत्तर है

SetStyle(ControlStyles.OptimizedDoubleBuffer, true); 

लंबे जवाब है: देखने MSDN या google

सिर्फ मनोरंजन के लिए, बुला Application.DoEvents() के बाद प्रत्येक तत्व अद्यतन किया जाता है की कोशिश, और समस्या है यह देखने के बेहतर या बदतर हो जाता है ;-)

+0

मुझे यकीन नहीं है कि मदद मिलेगी। ऐसा लगता है कि मानक नियंत्रण झटके के साथ समस्या है, और अनुकूलित DoubleBuffer केवल कस्टम प्रस्तुत नियंत्रण के साथ मदद करेगा। –

+0

@ [कैमरून मैकफ़ारलैंड]: यह कोशिश करने के लिए चोट नहीं पहुंचा सकता है ... –

0

भूत का कारण आमतौर पर होता है क्योंकि आप एक ही थ्रेड में चल रहे हैं और इसे फ़ील्ड अपडेट के साथ रखा जा रहा है ताकि पेंट इवेंट आग न हो। इसे ठीक करने का एक तरीका असीमित तरीके से भारी उठाना होगा। यह फॉर्म को खुद को पुन: पेश करने की अनुमति देगा और जब भी एसिंक विधि वापस कॉल करता है तो उसे अपडेट करें।

4

आप पर कॉल करने का प्रयास कर सकते हैं। SuspendLayout(); अपना अपडेट शुरू करने से पहले और यह। रेस्यूमआउट (झूठा); जब आप इस तरह से सभी मानों को सेट करना समाप्त कर चुके हैं तो इसे फ़ॉर्म को एक समय में मूल्य लिखने से रोकना चाहिए।

+1

निलंबन/resumelayout नियंत्रण जोड़ने और आगे बढ़ने से संबंधित घटनाओं को दबाने के लिए हैं –

+1

सही, घटनाएं केवल बड़े समूहों को अद्यतन करते समय लेआउट कार्यों को कई बार बुलाए जाने से रोकती हैं नियंत्रित करता है। चूंकि ये कार्य लेआउट तेज करेंगे लेकिन झिलमिलाहट को रोक नहीं पाएंगे। डबल बफरिंग के संयोजन के साथ उनका उपयोग करने से सर्वोत्तम परिणाम मिलेंगे। – Toji

1

आप double buffer लगभग हर खिड़कियां नियंत्रण बना सकते हैं, हालांकि अधिकांश समय यह आवश्यक है कि आप वांछित नियंत्रण से प्राप्त हों और संरक्षित संपत्ति को ओवरराइड करें। सावधान रहें, हालांकि, मैंने एक ही मुद्दे पर काफी समय बिताया है और मैंने अभी तक अपने अधिक जटिल रूपों पर झिलमिलाहट को पूरी तरह से हटा दिया है।

आप वास्तव में झिलमिलाहट से मुक्त खिड़कियों चाहते हैं, मैं WPF पर रखने का सुझाव देते हैं।

5

यह मेरे लिए काम किया।

http://www.syncfusion.com/faq/windowsforms/search/558.aspx

मूल रूप से यह वांछित नियंत्रण से पाने और निम्नलिखित शैलियों की स्थापना करना शामिल है।

SetStyle(ControlStyles.UserPaint, true); 
SetStyle(ControlStyles.AllPaintingInWmPaint, true); 
SetStyle(ControlStyles.DoubleBuffer, true); 
0

मैं OpenGLES के साथ एक ही समस्या थी, जिसके कारण मैं इस सूत्र मिल गया। निश्चित रूप से मैं एहसास यू ओजीएल उपयोग नहीं कर रहे, लेकिन शायद यह यू वैसे भी मदद करता है,)

protected override void OnPaintBackground(PaintEventArgs e) { }

3

मैं जानता हूँ कि इस सवाल पुराना है, लेकिन भविष्य में खोजकर दूसरों यह होगा हो सकता है।

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

protected override CreateParams CreateParams 
{ 
    get 
    { 
     CreateParams cp = base.CreateParams; 
     cp.ExStyle |= 0x02000000; //WS_EX_COMPOSITED 
     return cp; 
    } 
} 

, लेकिन नियंत्रण के ड्राइंग अप खिलवाड़ के बिना (आपके प्रपत्र नाम प्रदान की है "Form1 "):

int intOriginalExStyle = -1; 
bool bEnableAntiFlicker = true; 

public Form1() 
{ 
    ToggleAntiFlicker(false); 
    InitializeComponent(); 
    this.ResizeBegin += new EventHandler(Form1_ResizeBegin); 
    this.ResizeEnd += new EventHandler(Form1_ResizeEnd); 
} 

protected override CreateParams CreateParams 
{ 
    get 
    { 
     if (intOriginalExStyle == -1) 
     { 
      intOriginalExStyle = base.CreateParams.ExStyle; 
     } 
     CreateParams cp = base.CreateParams; 

     if (bEnableAntiFlicker) 
     { 
      cp.ExStyle |= 0x02000000; //WS_EX_COMPOSITED 
     } 
     else 
     { 
      cp.ExStyle = intOriginalExStyle; 
     } 

     return cp; 
    } 
} 

private void Form1_ResizeBegin(object sender, EventArgs e) 
{ 
    ToggleAntiFlicker(true); 
} 

private void Form1_ResizeEnd(object sender, EventArgs e) 
{ 
    ToggleAntiFlicker(false); 
} 

private void ToggleAntiFlicker(bool Enable) 
{ 
    bEnableAntiFlicker = Enable; 
    //hacky, but works 
    this.MaximizeBox = true; 
} 
+0

यह सबसे अच्छा है और मेरी राय में निश्चित उत्तर है। – HydroPowerDeveloper

2

तुम बस कस्टम एक जो सच को DoubleBuffered संपत्ति की रक्षा की है के साथ मूल नियंत्रण बदल सकते हैं। जैसे तुम सिर्फ जाएँ * .Designer.cs फ़ाइल और की जगह सब इस एक के साथ देशी नियंत्रण का उल्लेख है

internal class DoubleBufferedListView : ListView { 

    public DoubleBufferedListView() 
     : base() { 
     this.DoubleBuffered = true; 
    } 

} 

उसके बाद: ListView के लिए यह कुछ इस तरह होगा।

पीएस इसके बजाय नियंत्रण से इनहेरिट की आप भी प्रतिबिंब के माध्यम से इस गुण सेट कर सकते हैं:

listView1.GetType().GetProperty("DoubleBuffered", BindingFlags.Instance | BindingFlags.NonPublic).SetValue(lsvReport, true, null); 

यह साफ नहीं है और न ही सिफारिश की है, लेकिन यह * .Designer.cs फाइलों में कोई परिवर्तन की आवश्यकता है।

2

यह आपके कोडिंग के कारण भी हो सकता है, न कि डबलबफरिंग की अनुपस्थिति। मैं अभी भी इसी तरह की समस्या के साथ आया था, लेकिन यह एहसास हुआ क्योंकि:

  1. जब कोई आइटम नहीं चुना जाता है तो मैंने अदृश्य को फ्रेम सेट किया है।
  2. उपयोगकर्ता चयन के बीच में, सूची सूची दृश्य द्वारा इंडेक्स को मंजूरी दे दी गई है।
  3. मैं SelectedIndexChanged का ईवेंट के लिए बाध्य कर रहा हूँ

दूसरे शब्दों में:

  • उपयोगकर्ता क्लिक करता है मद 1
    ~ SelectedIndexChanged (1)
  • उपयोगकर्ता क्लिक करता है आइटम 2
    ~ SelectedIndexChanged (-1) < ---- यह झिलमिलाहट
    ~ चयनित इंडेक्स चेंज (2)

तो समाधान क्या है? How to avoid thousands of needless ListView.SelectedIndexChanged events?

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