2

Eclipse で IProgressMonitor の実装を見ました。これはその後 SharpDevelop にもありますが、これがどのように機能するかはわかりません。もう少し理解しやすいかもしれない他の例はありますか?

私が達成しようとしているのは、1 つのプログレスバー (タスクはいつでも追加できます) によって一連のタスク (20 分から 5 秒まで大きく異なる) の進行状況を追跡する方法です。

このようなものは良い代替/アイデアでしょうか?

interface ITask
{
    int TotalWork; // ProgressMax
    event Progresschanged; // Notifies of the current progress
    event ProgressComplete;
}

次に、「モニター」は単純にオブザーバー パターンを使用して 2 つのイベントを監視します。すべてのプログレスバーが完了すると、プログレスバーが非表示になります。もう 1 つの問題は、これらが生成されている別のスレッドであることです。

誰かが私に何かアドバイスをしたり、正しい方向に導いたりできますか?

4

2 に答える 2

2

タスクのリストを維持し、全体的な貢献度によってそれらに重みを付けます。

struct Task { int work, progress  }
class OverallProgress
{
    List<Task> tasks;
    int Work { get { return tasks.Sum(t=>t.work; } }
    int Progress { get { return tasks.Sum(t=>t.progress/t.work); } }
    void AddTask(Task t) { tasks.Add(t); }
}

この実装は、概念を説明することのみを目的としています。

はい、この実装は効率的ではありません。計算結果を保存してWork、新しいタスクが追加されたときにのみ再計算できるようにすることができます。

はい、整数除算を行うと精度が低下する可能性があります。自分のイベントも配線する必要があります。

これらのタスクで問題が発生した場合は、そのことを伝えてください。私または他の誰かがそのようなクラスの完全な実装を提供できます。

于 2009-06-25T16:05:06.237 に答える
1

System.Component.BackgroundWorkerは、進行状況の通知を処理します。複数のBGワーカーを生成し、UIスレッドの単一のメソッドにレポートしてもらいます。その後、プログレスバーを更新できます。

于 2009-03-30T18:38:34.667 に答える