Pergunta

Para o meu aplicativo WPF, desenvolvi um teclado virtual. Ele funciona bem na minha máquina de desenvolvimento. No entanto, em máquinas mais lentas, a resposta do clique do botão é lenta. Depois que o botão é clicado, há um atraso antes que as atualizações de exibição com o estado do botão para baixo e o evento de botões. O que posso fazer para remover esse atraso? O problema é um problema de exibição do WPF?

Pensando que era o manipulador de eventos que foi lento, tentei várias abordagens para enviar um evento pressionado pela tecla. Não importa o que eu tentei, a interação ainda é lenta. Atualmente estou usando:

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

Importado do user32.dll. Meu manipulador de eventos é simplificado até o ponto em que está apenas criando os parâmetros e chamando a função acima.

Eu também tentei usar o seguinte, mas não tive nenhum desempenho melhor:

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

Como posso me livrar do atraso?

Foi útil?

Solução

Você pode dizer o que está causando seu atraso?

Se houver algo lento em seu Click evento, você pode querer usar um separado Thread Para executar o código. Dentro do novo tópico, se você tiver código que deve ser executado no tópico da interface do usuário, use Dispatcher.BeginInvoke Para fazer fila para ser executado quando a interface do usuário tiver tempo de processamento. Para manter a interface do usuário responsiva, você precisa manter qualquer código pesado fora do encadeamento principal (UI).

Se o seu teclado virtual é local para um certo Window, dependendo da complexidade do que você está fazendo, você pode levar uma abordagem que usei no passado onde você apenas preenche os caracteres do teclado no teclado no TextBox Isso tem foco.

Isenção de responsabilidade: Eu escrevi esse código há mais de 2 anos e odeio isso como resultado. Embora eu normalmente fingisse que não existia, pode ajudá -lo. Fiquei melhor desde então, mas o conceito em si não tinha problemas de desempenho em máquinas mais lentas. Eu citaria o blog de Jeff Atwood sobre o código que você mais odeia é o seu, mas, bem ...

Editar: Já que você ainda tem problemas mesmo com Click Vazio, você pode querer olhar para outros possíveis assaltos. A CPU do usuário é maximizada a 100% de algo? Animações muito pesadas ou outro evento em potencial? A maioria dos atrasos na interface do usuário geralmente é resultado de uma CPU máxima ou de um evento demorando muito no tópico da interface do usuário.

Uma possibilidade é se o seu Window tem AllowsTransparency="True", grande parte da carga de trabalho que normalmente iria para a placa gráfica agora será renderizado em software e pode ter penalidades de desempenho pesado. Depois disso, você pode dar uma olhada neste artigo da Microsoft em Otimizando o desempenho do aplicativo WPF Para algumas dicas gerais que podem acelerar seu processamento.

Eu sugeriria que qualquer pessoa que desenvolva no XAML leia o último artigo. A diferença de desempenho entre tão pequenos detalhes, como usar TextBlock vs. Label, ou implementando DependencyProperty's vs. INotifyPropertyChanged, pode realmente aumentar, e o fato de que eles fazem benchmarking contra cada um mostra realmente a importância do design adequado.

Outras dicas

Apenas encontrou esta discussão. Eu tenho um aplicativo Winforms, onde a resposta do botão foi lenta. Isso aconteceu depois que eu atualizei para o Windows 7. Encontrei que, se mudasse meu destino de projeto para "x86" (em vez de "qualquer CPU"), a resposta lenta do botão desapareceu.

Se o seu manipulador de eventos levar muito tempo para terminar, ele bloqueará a interface do usuário naquele tempo. Experimente este manipulador de eventos:

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

O manipulador de eventos provavelmente acaba mais rápido em uma máquina mais rápida. Para operações lentas, convém levar o trabalho a outro tópico.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top