2016-05-20 7 views
1

処理する数値(ここでは数値で書いた)が取った時間に応じてプログレスバーを更新しようとしています。progressBar最後に呼び出された値を更新するだけです

public static void updateProgress(int x) 
    { 
     Program.f.progressBar1.Visible = true; 
     Program.f.progressBar1.Enabled = true; 
     Program.f.progressBar1.Value +=x; 
     Thread.Sleep(5000); 
    } 

上記のfnは、プログレスバーの更新に使用されます。

public static Form1 f; 
    [STAThread] 
    static void Main() 
    { 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
     f = new Form1(); 
     f.progressBar1.Maximum = 100; 
     f.progressBar1.Minimum = 0; 
     f.progressBar1.Value = 0; 
     updateProgress(25);  //fn1 
     updateProgress(50);  //fn2 
     Application.Run(f); 
     } 

進捗バーには75%の進捗状況が直接表示されます。 おかげ

+0

フォームを表示する前に 'updateProgress()'呼び出しを削除します( 'Application.Run()'を呼び出すと表示されます)。例えば。 'updateProgress(25)'を呼び出す 'Click'イベントハンドラのフォームにボタンを追加します。通常、進行中のものは何が並列に実行されているか(例えば別のスレッド)、['Timer'](https://msdn.microsoft.com/en-us/library/system.windows.forms)を使って進めることができます。タイマー(v = vs.110).aspx)。 – Sinatr

+0

Application.Run()の後に呼び出された場合、進捗状況が表示されません。 – hrnjan

+1

Thread.Sleepは、現在のスレッドでの除外をブロックします。可能であれば、バックグラウンドワーカーまたは非同期/待機パターンを使用してみてください。 – user6144226

答えて

0

間違っ:フォームが表示される前に、あなたが何かをやっている:

static void Main() 
{ 
    f = new Form1(); // form instance is created 
    f.progressBar1.Maximum = 100; 
    f.progressBar1.Minimum = 0; 
    f.progressBar1.Value = 0; 
    updateProgress(25); // you do something and change property 
    updateProgress(50); // you do something and change property 
    Application.Run(f); // here form is displayed and you see the most recent change 
} 

正しい:(フォームが表示されている間)、バックグラウンドで実行され、作業をシミュレートするためにあなたのような何かを行うことができます:

static void Main() 
{ 
    f = new Form1(); // form instance is created 
    f.progressBar1.Maximum = 100; 
    f.progressBar1.Minimum = 0; 
    f.progressBar1.Value = 0; 
    // create and start task running in parallel 
    Task.Run(() => 
    { 
     Thread.Sleep(3000); // wait long enough until form is displayed 
     updateProgress(25); 
     updateProgress(50); 
    }); 
    Application.Run(f); 
} 

public static void updateProgress(int x) 
{ 
    // Invoke is required because we run it in another thread 
    f.Invoke((MethodInvoker)(() => 
    { 
     Program.f.progressBar1.Visible = true; 
     Program.f.progressBar1.Enabled = true; 
     Program.f.progressBar1.Value +=x; 
    })); 
    Thread.Sleep(5000); // simulate work 
} 
+0

@Sinatrに感謝します。 – hrnjan

関連する問題