3

多くの反復、行列演算などを含む非常に複雑なアルゴリズムを実装する必要があります。フーリエ級数近似には 2 つの主要なループがあります。プログレスコールバックを実装するための最良のアプローチは何かを知りたいです。私は将来、このアルゴリズムを WPF アプリで使用したいと考えており、進行状況バーを実装したいと考えています。将来、プログレスバーの実装を容易にするためのアルゴリズムをどのように準備しますか?

私は次のようなことを考えています:

static void Main(string[] args)
{
    Console.Write("Progres...  ");
    Alg((i) => UpdateProgress(i));            
}

public static void UpdateProgress(int iteration)
{
    string anim = @"|/-\-";            
    Console.SetCursorPosition(Console.CursorLeft - 1, Console.CursorTop);
    Console.Write(anim[iteration%5]);                        
}

public static void Alg(Action<int> progressCallback)
{
    for (int i = 0; i < 100; i++)
    {
        Thread.Sleep(50);
        progressCallback(i);
    }
}
4

2 に答える 2

2

を使用したい場合は、それを使い続けてTPLみませんか? 「IProgress」http://msdn.microsoft.com/pl-pl/library/hh193692.aspxを使用できます。

class Program
{
    static void Main(string[] args)
    {
        Console.Write("Progres...  ");

        Progress<int> progress = new Progress<int>();

        var task = Alg(progress);            

        progress.ProgressChanged += (s, i) => { UpdateProgress(i); };

        task.Start();
        task.Wait();
    }

    public static void UpdateProgress(int iteration)
    {
        string anim = @"|/-\-";
        Console.SetCursorPosition(Console.CursorLeft - 1, Console.CursorTop);
        Console.Write(anim[iteration % anim.Count()]);
    }

    public static Task Alg(IProgress<int> progress)
    {
        Task t = new Task
        (
            () =>
            {
                for (int i = 0; i < 100; i++)
                {
                    Thread.Sleep(50);
                    ((IProgress<int>)progress).Report(i);
                }
            }
        );
        return t;
    }
}
于 2013-03-27T14:39:23.960 に答える
0

インターフェイスINotifyPropertChangedを実装するオブジェクトが必要です。進行状況を表すこのオブジェクトのプロパティは、その進行状況を視覚化する XAML 要素 (Progressbar) にバインドされます。アルゴリズムでは、このプロパティを適切な値に設定するだけです。アルゴリズムは、このオブジェクトをパラメーターとして取得できます。または、アルゴリズムに提供されるデリゲートでこのプロパティを設定できます。複数のスレッドで作業している場合、WPF はプロパティの変更を UI スレッドに配信します。

于 2013-03-10T21:37:37.380 に答える