1

ボタンがあるとしましょう:btnExecute

このボタンは、次のすべてのメソッドを実行します。

doAction1();
doAction2();
doAction3();
doAction4();

これらの各アクションには数秒かかります。

これらの各メソッドが実行されるときに、プログレスバーを更新するにはどうすればよいですか?

それぞれにアクセスして、たとえばpbExecuteProgress.value = 10を追加するだけでよいことはわかっていますが、これを行うにはもっと良い方法があるはずだと思います。

私もこのようなことをしたくありません:

doAction1();
pbExecuteProgress.value = 30
doAction2();
pbExecuteProgress.value = 60
doAction3();
pbExecuteProgress.value = 80
doAction4();
pbExecuteProgress.value = 100

値が100になり、メソッドの進行状況に応じる進行状況バーを作成する方法はありますか?

4

3 に答える 3

4
var actions = new List<Action> {doAction1, doAction2, doAction3, doAction4};

foreach(var action in actions)
{
   action();
   progressBar.Value += (progressBar.Maximum - progressBar.Minimum) / actions.Count;
}

進行状況の値をカスタマイズしたい場合:

var actions = new Dictionary<Action, int> 
{
     {doAction1, 30}, 
     {doAction2, 30}, 
     {doAction3, 20}, 
     {doAction4, 20},
};

progressBar.Minimum = 0;
progressBar.Maximum = actions.Select(kvp=>kvp.Value).Sum();
progressBar.Value = 0;
foreach(var action in actions)
{
   action.Key();
   progressBar.Value += action.Value;
}

アクションのコレクションの宣言と作成は、ループする直前に行う必要はありません。実際、このパターン(戦略パターンの形式)の強みは、新しいアクションが現在のクラスの内外のどこからでも発生する可能性があることです。

于 2012-08-14T19:51:33.133 に答える
4

進行状況を「ネスト」すると、外側のメソッドは各サブルーチンの実行にかかる時間を推定し、その 100% をサブルーチン間で分割する必要があります。

方法 1 は 40%、方法 2 は 25% など、任意にこれを行うか、「予行演習」を行って各方法がどれだけの作業を行うかを決定することができます。たとえば、各メソッドが多数のファイルを処理する場合、ドライ ランは実際にはファイルを処理せずにファイルをカウントするため、各メソッドのファイル カウントを使用して、各メソッドに適用されるプログレス バーの範囲を割り当てることができます。

ドライ ラン アプローチでは、より正確な結果が得られますが、必要な前処理にかなりの時間がかかるため、タスク全体が遅くなる可能性があります。

各サブルーチンの範囲を取得したら、開始パーセンテージと終了パーセンテージを渡すことができ、進行状況を適切に進めることができます。

これを適切に処理する方法は、すべてのサブタスクのスケーリングを処理するプログレス マネージャー クラスを作成することです。これにより、呼び出しのサブツリー全体を簡単にネストし、進行状況の表示を処理するオブジェクトを 1 つだけ渡すことができます。

于 2012-08-14T19:38:45.777 に答える
0

本当に自分でやりたい場合は、メソッド全体だけでなく各メソッド内の各ステートメントのタイミングを計り、すべての時間を配列にスローし、それらをパーセンテージに変換し、em をテキストに書き込むことをお勧めします。ファイルか何か。すすぎ、繰り返し、平均を上げてから、一連のpbExecuteProgress.value = Xステートメントを追加する必要があります。あなたがそれをしたくないと言ったのは知っていますが、少なくともこの方法では、進行状況を本当に正確に表すことができます.

ちょっとした考え。

また、この種のことを行うサードパーティのツールがあると確信しています。ただし、上記の方法ほど正確であることは本質的に不可能です。

于 2012-08-14T19:39:59.723 に答える