3

私は現在WinFormsプロジェクトに取り組んでおり、ユーザー入力を受け取るために使用されるフォーム上にいくつかのテキストボックスがあります。ユーザーが入力した値に基づいて、フォームの他のフィールドの値が計算されます。その結果、計算を実行するために2つのイベントハンドラーのどちらを使用する必要があるのか​​混乱しています。textbox_Leaveまたはtextbox_TextChanged

textbox_TextChangedユーザーがテキストボックスの文字を変更するたびに発生するので、プロセッサの使用量の点で非常に高価だと思いますね。一方、textbox_Leaveは、ユーザーがテキストボックスを終了した後にのみ実行されます。ただし、このTextChangedイベントは、ユーザーにより良い応答性の高いエクスペリエンスを提供します。しかし、この経験は、私たちが取っている追加の処理ヒットの価値がありますか?使用した場合、私のプロジェクトは、より遅いプロセッサを搭載した古いシステムで正しく機能できますTextChangedか?

4

5 に答える 5

2

まず、単純なケースでテストします。計算がそれほど重くない場合は、そもそも問題がない可能性があります。

計算が非常に重く、さらにユーザーフレンドリーなソリューションが必要な場合は、タイマーを使用してスロットルメカニズムを実装できます。TextChangedイベントで、特定の遅延後に計算を開始するTickハンドラーでタイマーを開始します。タイマーが開始する前に別のTextChangedイベントを受信した場合は、タイマーをリセットしてください。もちろん、これには、タイマーイベントとtextchangedイベントの間の同期と場合によってはロックが含まれます。

于 2012-11-23T08:41:52.163 に答える
1

ここでの秘訣は、処理する必要がない場合は処理しないことです。通常、「ヘビーデューティーのもの」をスケジュールし、TextBoxが再度変更されていない場合は、しばらくしてから実行します。このようなもの:

  • テキストボックスが変更されました。以前にスケジュールされた更新をキャンセルします
    • x ミリ秒で更新をスケジュールします(これはアプリケーションの種類によって異なります)
  • テキストボックスが残っています。すぐに更新してください。
于 2012-11-23T08:42:10.500 に答える
0

Validated私は、イベントを使用して、入力に依存する計算を実行することを好みます。TextChangedユーザーがまだ値を入力しているときに発生し、入力がまだ無効なときに発生する可能性があります。イベントを処理するValidating場合、テキストボックスに無効な値が入力されるのを防ぐことができValidated、入力が有効な場合にのみ発生するようにすることができます。

于 2012-11-23T08:42:43.787 に答える
0

リアルタイムで計算できるユーザーを探している場合は、textChangedを使用します。カーソルがtextBoxを離れたときにのみ値を変更することは、ユーザーを混乱させ、イライラさせる可能性があります。

計算がどれほど複雑かを知らなければ、コストについて正確に話すことは困難です。それがあまりにも頻繁に起こることに関心がある場合は、いくつかの可能な解決策があります。リアルタイムであることが重要でない場合は、「脱退」イベントを使用する代わりに、ユーザーに「計算」ボタンを提供し、Enterキーが押されていることを確認します。これは、カーソルを振って計算するよりも、エンドユーザーにとってはるかに直感的です。

もう1つの可能な解決策は、textChangedイベントが開始する(または時間があればリセットする)タイマーを実装し、有効期限が切れたときにのみ計算を実行することです。そうすれば、速いタイピストが短い順序で大量の計算を実行することはありませんが、ユーザーが他に何も押さなくても、ほぼリアルタイムでユーザーエクスペリエンスを提供できます。

于 2012-11-23T08:45:12.867 に答える
0

実行しようとしている計算の説明に基づくと、古いコンピューターでも問題が発生することはないと思います。ユーザーが何かを入力する速度と比較して、コンピューターの能力を過小評価している可能性があります。

議論のために、速いタイピストが1分あたり100語を入力できるとしましょう。これは約800文字で、イベントは1秒間に約13回発生します。

したがって、ナプキンの計算では、ユーザーが別の文字を入力する前に、計算を実行して画面に結果を表示するのに約76ミリ秒かかることがわかります。

これは時期尚早の最適化の場合のようです。原則として、コードを事前に最適化するべきではありません。なぜなら、コードは必要ないだろうと私は確信しているからです。

そうは言っても、私はかつてDelayedActionと呼ばれるクラスを作成しました。これは、最適化する必要がある場合に、ニーズに合うものです。私は今私と一緒にコードを持っていませんが、簡単なグーグルは非常に似たものを見つけました。

http://www.codeproject.com/Tips/240274/Execute-later-for-delayed-action

于 2012-11-24T04:21:12.503 に答える