كيف يمكنني إلحاق كمية كبيرة من المحتوى الغني (الصور والتنسيق) بسرعة بعنصر تحكم دون استخدام الكثير من وحدة المعالجة المركزية؟

StackOverflow https://stackoverflow.com/questions/148881

  •  02-07-2019
  •  | 
  •  

سؤال

أنا أستخدم wxWidgets وVisual C++ لإنشاء وظائف مشابهة لاستخدام Unix "tail -f" بتنسيق غني (الألوان والخطوط والصور) في واجهة المستخدم الرسومية.أنا أستهدف كلاً من wxMSW وwxMAC.

الإجابة الواضحة هي استخدام wxTextCtrl مع wxTE_RICH، باستخدام استدعاءات wxTextCtrl::SetDefaultStyle() وwxTextCtrl::WriteText().

ومع ذلك، في محطة العمل 3 جيجا هرتز، التي تم تجميعها في وضع الإصدار، لا أستطيع متابعة السجل الذي ينمو بمعدل 1 مللي ثانية لكل سطر، ويتأخر في النهاية.في كل سطر أتحمل:

  1. مكالمتين لـ SetDefaultStyle()
  2. مكالمتان لـ WriteText ()
  3. استدعاء لـ Freeze() و Thaw() القطعة

عند تشغيل هذا، تصل وحدة المعالجة المركزية الخاصة بي إلى 100% على نواة واحدة باستخدام wxMSW بعد ملء ما يقرب من 20000 سطر.يصبح البرنامج أبطأ بشكل واضح بمجرد وصوله إلى حد معين، ويتخلف أكثر عن الركب.

أنا منفتح على استخدام عناصر التحكم الأخرى (wxListCtrl، wxRichTextCtrl، إلخ).

هل كانت مفيدة؟

المحلول 3

مشتق من wxVListBox.من المستندات:

wxVListBox هو عنصر تحكم يشبه مربع القائمة مع الاختلافين الرئيسيين التاليين عن مربع القائمة العادي:يمكن أن يحتوي على عدد كبير بشكل تعسفي من العناصر لأنه لا يخزنها بنفسه ولكنه يستخدم رد اتصال OnDrawItem() لرسمها (لذا فهو مربع قائمة افتراضي) ويمكن أن يكون لعناصره ارتفاع متغير كما هو محدد بواسطة OnMeasureItem() (لذلك فهو هو أيضًا مربع قائمة يحتوي على خطوط ذات ارتفاع متغير).

نصائح أخرى

هل فكرت في تحديد كمية الخطوط في العرض؟عندما واجهنا مشكلة مماثلة، تأكدنا من عدم عرض أكثر من 10000 سطر على الإطلاق.إذا ظهرت خطوط أكثر في الأسفل، فإننا نزيل الخطوط في الأعلى.لم يكن هذا يستخدم WxWidgets، بل كان يستخدم واجهة مستخدم Cocoa UI أصلية على نظام Mac، ولكن المشكلة هي نفسها.إذا زاد عرض النص المصمم (بالألوان والتنسيق والطباعة الجميلة) إلى حجم كبير، فإن إلحاق المزيد من البيانات في الأسفل يصبح بطيئًا جدًا.

يبدو أن عنصر التحكم الذي تستخدمه لم يتم تصميمه ليتناسب مع كمية البيانات التي تلقيها عليه.سأفكر في إنشاء عنصر تحكم مخصص.إليك بعض الأشياء التي يمكنك أخذها بعين الاعتبار:

  1. عند ظهور سطر جديد، لا تحتاج إلى إعادة عرض الأسطر السابقة...لا تتغير ولن يتغير التخطيط بسبب البيانات الجديدة.
  2. حاول الاحتفاظ فقط بالجزء المرئي بالإضافة إلى بضع شاشات استرجاع في الذاكرة في المرة الواحدة.وهذا من شأنه أن يجعلها أخف قليلا ...ولكن سيتعين عليك القيام بإدارة التمرير الخاصة بك إذا كنت تريد أن يتمكن المستخدم من التمرير للخلف أكثر من المراجعة الخاصة بك وجعل كل شيء يبدو سلسًا.
  3. لا تقم بالضرورة بتحديث سطر واحد في كل مرة.عندما تكون هناك بيانات جديدة، احصل عليها كلها وقم بتحديثها.إذا حصلت على 10 أسطر بسرعة كبيرة، وقمت بتحديث الشاشة كلها مرة واحدة، فقد توفر بعض النفقات العامة للقيام بذلك سطرًا تلو الآخر.

أتمنى أن يساعدك هذا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top