سؤال

لتطبيق WPF الخاص بي، قمت بتطوير لوحة مفاتيح افتراضية. يعمل بشكل جيد على جهاز التطوير الخاص بي. ومع ذلك، عند آلات أبطأ، انقر فوق الزر Click Response بطيء. بعد النقر فوق الزر، هناك تأخير قبل تحديثات العرض مع زر أسفل الحالة وحدث الأزرار. ماذا يمكنني أن أفعل لإزالة هذا التأخير؟ هل المشكلة مشكلة عرض WPF؟

اعتقد انه كان معالج الأحداث التي كانت بطيئة، لقد جربت عدة أساليب لإرسال حدث مضغوط مفتاح لوحة المفاتيح. بغض النظر عن ما حاولت، فإن التفاعل لا يزال بطيئا. حاليا أنا أستخدم:

SendInput(uint nInputs, ref INPUT pInputs, int cbSize);

المستوردة من user32.dll. يتم تبسيط معالج الأحداث الخاص بي إلى النقطة التي لا يتم فيها إنشاء المعلمات فقط واستدعاء الوظيفة أعلاه.

لقد حاولت أيضا استخدام ما يلي، لكن لم يكن لديك أي أداء أفضل:

 System.Windows.Input.Keyboard.FocusedElement.RaiseEvent(...)

كيف يمكنني التخلص من التأخير؟

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

المحلول

هل يمكنك معرفة ما الذي يسبب تأخيرك؟

إذا كان هناك شيء بطيء في Click الحدث، قد ترغب في استخدام منفصلة Thread لتنفيذ التعليمات البرمجية. ضمن الخيط الجديد، إذا كان لديك رمز يجب تنفيذه على مؤشر ترابط UI، استخدم Dispatcher.BeginInvoke في قائمة الانتظار ليتم تنفيذها عندما يكون لدى UI وقت المعالجة. للحفاظ على استجابة UI، تحتاج إلى الاحتفاظ بأي كود ثقيل خارج الموضوع الرئيسي (UI).

إذا كانت لوحة المفاتيح الافتراضية محلية على بعض Window, ، اعتمادا على تعقيد ما تفعله، يمكنك أن تأخذ نهج استخدمته في الماضي حيث يمكنك فقط ملء أحرف لوحة المفاتيح TextBox التي تركز.

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

تعديل: لأنه لا يزال لديك مشاكل حتى مع Click فارغة، قد ترغب في إلقاء نظرة على HOLD-UPS المحتمل الأخرى. هل تم الحد من وحدة المعالجة المركزية للمستخدم بنسبة 100٪ من شيء ما؟ إما الرسوم المتحركة الثقيلة جدا، أو حدث محتمل آخر؟ عادة ما تكون معظم تأخير واجهة المستخدم عادة نتيجة لمعهد وحدة المعالجة المركزية القديمة أو الحدث يستغرق وقتا طويلا على مؤشر ترابط UI.

احتمال واحد هو إذا كان لديك Window لديها AllowsTransparency="True", ، الكثير من عبء العمل الذي يذهب عادة إلى بطاقة الرسومات سيتم الآن تقديمها في البرامج، ويمكن أن يكون لها عقوبات أداء ثقيلة. بعد ذلك، يمكنك إلقاء نظرة على مقالة Microsoft هذه تحسين أداء تطبيق WPF بالنسبة لبعض النصائح العامة التي يمكن أن تسرع المعالجة الخاصة بك.

أود أن أقترح أي شخص يطور في XAML اقرأ هذا المقال الأخير. الفرق في الأداء بين التفاصيل الصغيرة مثل استخدام TextBlock ضد. Label, أو تنفيذ DependencyPropertyمقابل INotifyPropertyChanged, ، يمكن أن تضيف حقا، وحقيقة أنهم يعرضون ضد كل يوضح حقا أهمية التصميم المناسب.

نصائح أخرى

ركض فقط عبر هذه المناقشة. لدي تطبيق WinForms حيث كان استجابة الزر بطيئا. حدث ذلك بعد أن قمت بالترقية إلى Windows 64 بت.

إذا استغرق معالج الحدث الخاص بك وقتا طويلا حتى النهاية، فسوف يقوم بإغلاق UI لهذا الوقت. جرب معالج الأحداث هذا:

  private void button1_Click(object sender, RoutedEventArgs e)
  {
     System.Threading.Thread.Sleep(5000);
  }

من المحتمل أن تنتهي معالج الحدث الخاص بك بشكل أسرع على جهاز أسرع. للعمليات البطيئة، قد ترغب في دفع العمل إلى مؤشر ترابط آخر.

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