Вопрос

Для моего приложения WPF я разработал виртуальную клавиатуру.Он отлично работает на моей машине разработки.Однако на более медленных машинах реакция на нажатие кнопки происходит медленно.После нажатия кнопки возникает задержка, прежде чем дисплей обновится состоянием нажатия кнопки и событием buttons.Что я могу сделать, чтобы устранить эту задержку?Является ли проблема проблемой отображения WPF?

Думая, что медленным был обработчик событий, я попробовал несколько подходов для отправки события нажатия клавиши клавиатуры.Независимо от того, что я пробовал, взаимодействие по-прежнему происходит медленно.В настоящее время я использую:

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

Импортировано из user32.dll.Мой обработчик событий упрощен до такой степени, что он только создает параметры для вышеупомянутой функции и вызывает ее.

Я также пробовал использовать следующее, но производительность не улучшилась:

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

Как я могу избавиться от задержки?

Это было полезно?

Решение

Можете ли вы сказать, что является причиной вашей задержки?

Если у вас что-то медленное Click событие, вы можете использовать отдельный Thread для выполнения кода.Если в новом потоке у вас есть код, который должен быть выполнен в потоке пользовательского интерфейса, используйте Dispatcher.BeginInvoke поставить его в очередь на выполнение, когда у пользовательского интерфейса есть время обработки.Чтобы пользовательский интерфейс оставался отзывчивым, вам необходимо убрать весь тяжелый код из основного потока (UI).

Если ваша виртуальная клавиатура является локальной для определенного Window, в зависимости от сложности того, что вы делаете, вы можете взять подход, который я использовал в прошлом где вы просто вручную вводите символы клавиатуры в TextBox у которого есть фокус.

Отказ от ответственности: Я написал этот код более двух лет назад и в результате ненавижу его.Обычно я делаю вид, что его не существует, но это может вам помочь.С тех пор я сделал его лучше, но сама концепция не имела проблем с производительностью на более медленных машинах.Я бы процитировал блог Джеффа Этвуда о том, что код, который вы больше всего ненавидите, — ваш собственный, но…

Редактировать: Поскольку у вас все еще есть проблемы даже с Click пусто, вы можете посмотреть на другие потенциальные ограбления.Процессор пользователя загружен на 100% из-за чего-то?Либо слишком тяжелая анимация, либо другое потенциальное событие?Большинство задержек пользовательского интерфейса обычно являются результатом либо максимальной загрузки процессора, либо события, занимающего слишком много времени в потоке пользовательского интерфейса.

Одна из возможностей заключается в том, что если ваш Window имеет AllowsTransparency="True", большая часть рабочей нагрузки, которая обычно ложится на видеокарту теперь будет отображаться в программном обеспечении и может иметь серьезные потери производительности. Кроме того, вы можете взглянуть на эту статью Microsoft на Оптимизация производительности приложения WPF некоторые общие советы, которые могут ускорить вашу обработку.

Я бы посоветовал всем, кто разрабатывает XAML, прочитать последнюю статью.Разница в производительности между такими мелкими деталями, как использование TextBlock против. Label, или внедрение DependencyPropertyпротив. INotifyPropertyChanged, действительно могут складываться, и тот факт, что они проводят сравнительное тестирование каждого из них, действительно показывает важность правильного проектирования.

Другие советы

Только что наткнулся на это обсуждение.У меня есть приложение WinForms, в котором реакция кнопки была медленной.Это произошло после того, как я обновился до 64-битной Windows 7.Я обнаружил, что если изменить цель проекта на «x86» (вместо «Любой процессор»), медленный отклик кнопок исчезнет.

Если вашему обработчику событий потребуется много времени для завершения работы, он заблокирует пользовательский интерфейс на это время.Попробуйте это обработчик событий:

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

Вероятно, ваш обработчик событий просто быстрее завершается на более быстрой машине.Для медленных операций вы можете перенести работу в другой поток.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top