質問

WPF アプリケーション用に仮想キーボードを開発しました。私の開発マシンでは問題なく動作します。ただし、遅いマシンではボタンのクリックの反応が遅くなります。ボタンをクリックした後、ボタンが押された状態とボタン イベントによって表示が更新されるまでに遅延が生じます。この遅延を解消するにはどうすればよいでしょうか?問題は 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 それは焦点があります。

免責事項: 私はそのコードを 2 年以上前に書きましたが、結果として嫌いになりました。通常は存在しないふりをしますが、役立つかもしれません。それ以来改善してきましたが、コンセプト自体は低速のマシンでもパフォーマンスに問題はありませんでした。Jeff Atwood のブログを引用すると、あなたが最も嫌うコードはあなた自身のコードです、しかし、まあ...

編集: それでもまだ問題があるので、 Click 空の場合は、他の潜在的なホールドアップを確認することをお勧めします。ユーザーの CPU は何かによって 100% に最大化されていますか?アニメーションが重すぎますか、それとも別の潜在的なイベントですか?ほとんどの UI 遅延は、通常、CPU が最大値に達したか、UI スレッドでのイベントに時間がかかりすぎたことが原因で発生します。

可能性の 1 つは、次のような場合です。 Window もっている AllowsTransparency="True", 、通常はグラフィックス カードにかかるワークロードの多くが発生します。 今後はソフトウェアでレンダリングされるため、パフォーマンスが大幅に低下する可能性があります。 さらに、次の Microsoft の記事を参照してください。 WPF アプリケーションのパフォーマンスの最適化 処理を高速化するための一般的なヒントについては、こちらをご覧ください。

XAML で開発している人は、その最後の記事を読むことをお勧めします。使い方などの細かい部分での性能の違いは TextBlockLabel, 、または実装する DependencyPropertyさんvs. INotifyPropertyChanged, 、実際には合計する可能性があり、それぞれに対してベンチマークを実行しているという事実は、適切な設計の重要性を示しています。

他のヒント

は、ちょうどこの議論全体に走りました。私は、ボタンのレスポンスが遅かったのWinFormsアプリケーションがあります。これは私が64ビット版のWindows 7にアップグレードした後、私は私が(代わりに「どれCPU」の)の「x86」に私のプロジェクトのターゲットを変更した場合、遅いボタンの反応が離れていったことがわかっ起こっています。

あなたのイベントハンドラが終了するのに長い時間がかかる場合、それはその時のためのUIをロックします。これを試して イベントハンドラます:

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

あなたのイベントハンドラは、おそらく速く速くマシンに終了します。遅い操作では、あなたが別のスレッドに作業をプッシュしたい場合があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top