2012-03-09 15 views
0

私は別のスレッドでいくつかのデータ型チェックを行っている間にプログレスバーを更新しようとしていますが、進捗バーの値と実際に表示される値の間に遅延があるようです。control.invoke()issue

次のコードは、非GUIスレッドによって実行され、イベントを発生させるために使用されます。

protected virtual void OnUpdateProgressBar(object sender, ProgressBarEventArgs e) 
    { 
     EventHandler<ProgressBarEventArgs> TempHandler = UpdateProgressBar; 

     //Avoid possible race condition. 
     if (TempHandler != null) 
     { 
      TempHandler(this, e); 
     } 
    } 

プログレスバーを更新するための別のクラスを作成しました。インスタンスを作成するときに、プログレスバーへの参照を渡します。以下はクラス全体です。

public class ProgressBarChanged 
{ 
    ProgressBar statusBar; 

    public ProgressBarChanged(ProgressBar pb) 
    { 
     statusBar = pb; 
     statusBar.Value = 0; 
    } 
    public ProgressBarChanged() 
    { 
    } 

    public void subscribeToEvent(DataVerification test) 
    { 
     test.UpdateProgressBar += new EventHandler<ProgressBarEventArgs>(incrementPB); 
    } 

    public void incrementPB(object sender, ProgressBarEventArgs e) 
    { 
     Action action =() => 
     { 
      if (e.CurrentRow == e.FinalRow - 10) 
      { 
       int i = 5; 
      } 
      statusBar.Maximum = e.FinalRow; 
      statusBar.Value = e.CurrentRow; 
     }; 

     if(statusBar.InvokeRequired) 
      statusBar.Invoke(action); 
     else 
      action(); 
    } 
} 

プログレスバーと実際の値を示すスクリーンショットをアップロードしました。 アイデア???

おかげ

enter image description here

+0

'statusBar.Invoke(incrementPB、sender、e);で試したことがありますか? – Steve

+0

statusBar.Invoke(incrementPB、sender、e)の両方を試しました。 statusBar.Invoke(incrementPB(sender、e));どちらも働かない。 –

+0

@ Ken2K、画像を並べ替えてくれてありがとう。 –

答えて

3

プロジェスバーは、正確な計測器では​​なく、ユーザーに簡単なフィードバックを与えます。おしゃぶりです。

また、(メッセージループとは無関係に)画面を更新する独自の非同期ロジックも組み込まれています。これは少し遅れて実行される可能性があります。

大したことはありますか?

より正確な結果を得るには、範囲を<個のセグメントに分割し、更新回数を減らします。

+0

@At present各行が130,000回処理された後にイベントが発生しています。あなたが示唆しているように、それを100回以内に起こし、それが問題を解決するかどうかを確認してください。あなたの助けをありがとう –

+2

@HansRudel値が100回(130k回ではない)だけ更新されると、CPU消費量も大幅に削減されるので、良い考えです。 – ken2k

+0

@ ken2k:Dulyは感謝しました。 –

0

遅延はかなり正常です。結局のところ、UIスレッドでメソッドを呼び出すと、Windowsはメッセージを送出し、スレッドが十分速く(CPUが消費されている)、UIよりも速く表示されます。

+0

:お返事ありがとうございます。 Mr Skeetの投稿によるとhttp://stackoverflow.com/questions/229554/whats-the-difference-between-invoke-and-begininvoke私はスレッドがGUIが進行状況バーの更新を処理するのを待つが、それとも、内部的な価値を変えて、実際に更新を見せるのに時間がかかりますか?もしそうなら、この遅れを回避する方法がありますか? –

+0

スレッドは、PBが新しい値_を受け入れるのを待つ。視覚的な更新は別々に行われます。 –

+0

各値の変更後にリフレッシュを呼び出そうとします(ただし、この方法でプログバーをリフレッシュするのは最適ではありません)。 – ebutusov