2016-10-04 12 views
10

मैं हाल ही में एक आरटीएफ संपादक जो केवल एक साधारण UserControlPreviewTextInput और PreviewMouseUp की तरह एक जोड़े घटनाक्रम के साथ एक RichTextBox है कि विकासशील किया गया है कारण बनता है।RichTextBox - यूआई आकार बहुत बड़ा सीपीयू लोड

मैंने कुछ परेशान हालांकि देखा। यूआई का आकार बदलने पर RichTextBox का प्रदर्शन बिल्कुल भयानक है और RichTextBox में इसके रैपिंग एल्गोरिदम को आग लगने के लिए बहुत सारे टेक्स्ट हैं।

यह एप्लिकेशन को वास्तव में मैला महसूस करता है, जैसे कि यह खराब रूप से अनुकूलित है (भले ही यह नहीं है)।

पहले मैंने टेक्स्ट का चयन करते समय यह प्रदर्शन हिट देखा, इसलिए SelectionChanged ईवेंट का उपयोग करने के बजाय, मैंने PreviewMouseUp ईवेंट का उपयोग करने का निर्णय लिया और फिर चयन प्राप्त किया।

फिर आगे परीक्षण के बाद मुझे पता चला कि आकार में भारी भार भी हुआ है। और मैं 5% -> 30% के बीच लोड के बारे में बात कर रहा हूं जिसमें क्वाड-कोर सीपीयू 3.8GHz पर चल रहा है!

आगे इसे बाहर का परीक्षण करने के लिए, मैं अपने RichTextBox बाहर टिप्पणी करने का फैसला किया और केवल एक नया RichTextBox कोई परिभाषित संपत्ति

<RichTextBox/> 

एक विंडो में इस सम्मिलित करना, पाठ के साथ भरने, और उसके बाद के लिए विंडो का आकार बदलने के साथ शामिल रैपिंग एल्गोरिदम ने फिर से वही किया, 30% तक उपयोग!

मैं इस मामले के बारे में अनुसंधान करने के लिए करने की कोशिश की, और ज्यादातर लोगों आदेश रैपिंग को रोकने के लिए उच्च मूल्यों के लिए PageWidth स्थापित करने की सिफारिश करने समाप्त हो गया:

richTextBox1.HorizontalScrollBarVisibility = ScrollBarVisibility.Visible; 
richTextBox1.Document.PageWidth = 1000; 

कौन सा मैं नहीं चाहता कि चाहते हैं, संपादक के पिछले संस्करण के बाद से मैंने WinForms के साथ लिखा था और आसानी से लपेट सकता था, और मैं इसे नए WPF संस्करण में भी चाहता हूं।

क्या किसी और को कभी इस समस्या का सामना करना पड़ा? यदि हां, तो क्या आप हार्डवेयर पर इस विशाल तनाव को दूर करने के लिए मुझे सही दिशा में इंगित कर सकते हैं?

मुझे थोड़ा दुःख है क्योंकि मुझे डब्ल्यूपीएफ पसंद है, लेकिन मुझे एक या अन्य ऑब्जेक्ट मिला जो वास्तव में अनौपचारिक है और/या WinForms समकक्ष की तुलना में व्यावहारिक नहीं है, RichTextBox उन मामलों में से एक है :(

पाठ की बड़ी राशि के लिए क्षमा करें, लेकिन मैं वास्तव में इस बड़े करीने से मामले में कुछ अन्य गरीब आत्मा इस मुद्दे का सामना कर रहा है और तुम लोगों को देखने के लिए क्या मैं अब तक की कोशिश की है के लिए दस्तावेज़ करना चाहता था।

उत्तर

7

एक इस समस्या को दूर करने का तरीका खिड़की का आकार बदलते समय "नो रैप" मोड पर स्विच करना हो सकता है, लेकिन जब उपयोगकर्ता आकार बदलने के साथ समाप्त होता है - सामान्य मोड पर वापस स्विच करें। फिर एल्गोरिदम लपेटकर अंत में केवल एक बार निष्पादित किया जाएगा और आप sers अभी भी आपके आवेदन के बारे में चिकनी लग रहा है। नमूना कोड:

public partial class MainWindow : Window 
{ 
    public MainWindow() { 
     InitializeComponent(); 
     this.SizeChanged += OnSizeChanged; 
    } 

    private Timer _timer; 
    private void OnSizeChanged(object sender, SizeChangedEventArgs e) { 
     // user started resizing - set large page width 
     textBox.Document.PageWidth = 1000; 
     // if we already setup timer - stop it and start all over 
     if (_timer != null) { 
      _timer.Dispose(); 
      _timer = null; 
     } 

     _timer = new Timer(_ => { 
      // this code will run 100ms after user _stopped_ resizing 
      Dispatcher.Invoke(() => 
      { 
       // reset page width back to allow wrapping algorithm to execute 
       textBox.Document.PageWidth = double.NaN; 
      }); 
     }, null, 100, Timeout.Infinite); 
    } 
} 
+0

मजेदार कैसे मैंने स्पष्ट विकल्प के बारे में नहीं सोचा जो कि Resize कॉल ला रहा है, मुझे लगता है कि मैं बहुत थक गया हूं। आपके कोड में एक त्रुटि है जहां आप बीटीडब्ल्यू को आमंत्रित करने का प्रयास कर रहे हैं, निम्नलिखित इसे सुधारता है: डिस्पैचर।आमंत्रित करें (नई क्रिया (() => {})); –

+0

वैसे, टाइमर का उपयोग इस स्थिति में जोखिम भरा है, क्योंकि पीसी के प्रदर्शन के आधार पर, घटना वास्तव में अभी भी आकार बदल सकती है या नहीं, मेरे मामले में मुझे इसके लिए 300ms का उपयोग कम से कम काम करना था, लेकिन यह निश्चित रूप से मुझे सही दिशा में इंगित करता है, मैं इसे अपनी आवश्यकता के अनुरूप बदलने के लिए बदल रहा हूं, अंततः टाइमर से छुटकारा पा रहा हूं। धन्यवाद। –

+0

यदि आप यह जानने में भी रुचि रखते हैं कि यह प्रदर्शन-वार कैसे है, इससे मुझे ओवरहेड को 50% तक कम करने में मदद मिली है, अब यह बहुत कम टेक्स्ट अंदर है, तो आकार बदलते समय 15% उपयोग पर है, आईएमओ रिचटेक्स्टबॉक्स एक बड़ी गड़बड़ी है प्रदर्शन की वजह से, ऐसा लगता है कि रैप एल्गोरिदम इन मुद्दों के कारण एकमात्र कारक नहीं है, वैसे भी, मुझे सही दिशा में इंगित करने के लिए एक बार फिर धन्यवाद;) –

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