3

私は初めてのC#GUIを作成しています。を使用してBackgroundWorker、計算量の多いシミュレーションを実行しています。シミュレーションは定期的に(ProgressChangedイベントを通じて)GUIに表示する必要のあるかなりの量の情報を報告します。

GUIはコントロールに分割されており、各コントロールに「自分自身を更新する」方法を知ってもらいたいです。

私の研究では、これを行うことができるかもしれない多くの方法を見つけました。

  • ProgressChangedGUIの各部分でupdateメソッドを呼び出すメソッドbougndを用意することも考えられました。
  • GUIを使用して、各コントロールの更新メソッドをイベントInvalidateにバインドできます。Validating
  • ProgressChanged各コントロールのupdateメソッドをイベントにバインドできます。
  • 各コントロールにインターフェイスを実装させることもできINotifyPropertyChangedます(ただし、これが機能するかどうかについては懐疑的です)

これらすべてのオプションのうち、ProgressChangedイベント時にGUI全体を更新するためのベストプラクティスはどれですか。(または私は左翼手に出ていますか?)

コメントから:

private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
  Simulation simulation = new Simulation();
  while(true)
  {
    simulation.RunIteration();
    backgroundWorker.ReportProgress(-1, simulation);
  }
}
4

2 に答える 2

3

特別なことをする必要はありません。

ProgressChangedハンドラーは、データを「解凍」して、コントロールの関連するプロパティを設定できます。無効化と再描画は自動的に行われ、GUIスレッドで実行されます。

'頻繁に'を更新する場合にのみ注意する必要があります。頻度が高すぎる頻度はデータの量によって異なりますが、ハンドラーは次の更新のかなり前に終了する必要があります。そうでない場合は、スロットルメカニズムを組み込みます。

于 2012-05-16T16:20:11.500 に答える
1

ProgressBarは私がお勧めする方法です。GUIに送信するデータがテキストの場合は、リッチテキストボックスまたは通常のテキストボックスを使用して、進行状況バーが変更されたときにテキストを渡すことができます。

public void SomeThread_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    /* Update progress bar */
    ProgressBar.Value = (e.ProgressPercentage);
    if (e.UserState != null)
    {
        TextBox.Text += (string)e.UserState;
    }
}

他の形式のデータの場合、プログレスバーに特定の値が指定されたときにXを実行するIfステートメントを含めることができます。

しかし、あなたが具体的に何をしようとしているのかをもっと知ることなく、私はそれ以上の助けを提供することはできないのではないかと思います。

于 2012-05-16T16:26:52.327 に答える