2009-03-30 11 views
2

EclipseではIProgressMonitorの実装を見ましたが、これはSharpDevelopでも実装されていますが、どのように動作するのか分かりません。もう少し理解しやすいかもしれない他の場所の例がありますか?C#での進捗モニタの実装

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

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

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

次に「モニター」は、単に二つの事象を監視するために、Observerパターンを使用しています。すべてのプログレスバーが完了すると、プログレスバーが非表示になります。もう1つの問題は、これらのスレッドが生成されている別個のスレッドであることです。

誰かに私に助言をしたり、正しい軌道に乗ってくれませんか?

+0

IProgressMonitorは.netフレームワークの一部ではありません。 googleを見て、それは日食apiの一部であるようです... /肩をすくめます。 – Tony

+0

(タスクはいつでも追加できます) - 進行状況バーが縮小しても問題ありません。 – dss539

+0

私が与えた例を更新しました。申し訳ありませんが、あなたは今まで投稿していませんでした。http://stackoverflow.com/questions/596991/c-multi-thread-pattern/956297#956297 SwDevMan81

答えて

1

System.Component.BackgroundWorkerは進行状況通知を処理します。私は複数のBG作業者を作成し、UIスレッド上の単一のメソッドに報告するようにします。その後、進行状況バーを更新することができます。

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を保存して、新しいタスクが追加されたときにのみ再計算できるようにすることができます。

はい整数の除算を行うと精度が低下する可能性があります。 あなた自身のイベントも結ばなければなりません。

これらのタスクに問題がある場合は、それを述べてください。私または他の誰かがそのようなクラスを完全に実装することができます。