2

(あまり良くないタイトルで申し訳ありません。私の問題をどのように解決できるかわかりません。したがって、私が尋ねる必要がある質問は何ですか:)

環境

プログレス バーを使用して、タスクの進行状況をユーザーに通知します。このタスクは実際には 2 つのステップで実行され、それぞれの実行にかかる時間は全体の約半分です。2 番目のタスクの長さは、開始する直前にしかわかりません (前のタスクの結果に依存するため)。したがって、最初の最大の進行状況を知ることはできません。そのため、2 番目のタスクの前に進行状況バーの最大進行状況を変更します。

これは基本的に私がそれを行う方法です:

// 1st step
progressBar.Maximum = step1Objects.Count * 2; // "2" because the step will take 
                                              // half of the total process
progressBar.Value = 0;
foreach (SomeObject step1Object in step1Objects) {
    // Build step2Objects
    progressBar.Value = ++progress;
}
// At this moment, the progress bar is half filled

// 2nd step
progressBar.Maximum = step2Objects.Count * 2;
progressBar.Value = step2Objects.Count;
// When we start this step, the progress bar is already half filled
foreach (SomeObject step2Object in step2Objects) {
    // Do something
    progressBar.Value = ++progress;
}
// At this moment, the progress bar is totally filled

問題

この行に到達すると:

progressBar.Maximum = step2Objects.Count * 2;

step1Objects.Count...プログレスバーは、に比べて非常に小さいため、半分は満たされていない短い瞬間step2Objects.Countです。したがって、進行状況バーは次のようになります (それがユーザーに表示されます)。

>          |
=>         |
==>        |
===>       |
====>      |
=====>     |  End of step 1
=>         |  progressBar.Maximum = step2Objects.Count * 2;
=====>     |  progressBar.Value = step2Objects.Count;
======>    |
=======>   |
========>  |
=========> |
==========>|

質問

この「グリッチ」を回避するにはどうすればよいですか?

やるべきことは、2 つのステップの間でプログレス バーの更新を停止することだと思います。BeginUpdate / EndUpdateのようなもので考えていましたが、進行状況バーには存在しないようです...

4

3 に答える 3

1

あなたは、両方のタスクが実行される合計時間の約半分であると書いています。

progressBar.Maximum = 100;

var stepPercentage = 50 / step1Objects.Count;
foreach(SomeObject step1Object in step1Objects)
{
    progressBar.Progress += stepPercentage;
}

progressBar.Progress = 50;
stepPercentage = 50 / step2Objects.Count;
foreach(SomeObject step2Object in step2Objects)
{
    progressBar.Progress += (stepPercentage + 50);
}
于 2012-07-25T08:29:24.187 に答える
1

progressBar の Max を step1Objects.Count * step2Objects.Count * 2 に設定します

progressBar.Maximum = step1Objects.Count * step2Objects.Count * 2;

次に、ループで次を試してください。

progressBar.Value = 0;
//phase 1
foreach (SomeObject step1Object in step1Objects) {
    // Build step2Objects
    progress = progress + step2Objects.Count;
    progressBar.Value = progress;
}

//phase 2
foreach (SomeObject step2Object in step2Objects) {
    // Do something
    progress = progress + step1Objects.Count;
    progressBar.Value = progress;
}
于 2012-07-25T08:38:01.297 に答える
0

100 や 200 などの標準値を使用します。次に、2 で割ります。ステップ 1 は半分、ステップ 2 は半分です。これで、ステップ 1 に必要なアイテムの数がわかったので、50% をその数で割って、ステップ 1 の各オブジェクトの完了量を取得します。これは、ステップ 1 が完了すると、プログレス バーの 50% がいっぱいになったことを意味します。次に、次の 50% をステップ 2 のオブジェクトの量で割って、オブジェクトごとに x の量を既に満たした 50% に追加します。

于 2012-07-25T08:29:45.773 に答える