ホームページ > バックエンド開発 > C++ > UI をブロックせずに、外部計算の進行状況を WinForms プログレス バーに表示するにはどうすればよいですか?

UI をブロックせずに、外部計算の進行状況を WinForms プログレス バーに表示するにはどうすればよいですか?

Patricia Arquette
リリース: 2025-01-14 10:50:41
オリジナル
594 人が閲覧しました

How Can I Display Progress from External Calculations in a WinForms Progress Bar Without Blocking the UI?

外部プロセスからの WinForms プログレス バー更新: ノンブロッキング ソリューション

WinForms の進行状況バーは、タスクの進行状況に関する視覚的なフィードバックを提供します。 ただし、UI をフリーズさせずに外部計算またはライブラリからの進行状況の更新を管理することには課題があります。 これらの外部プロセス内から進行状況バーを直接更新すると密結合が生じ、UI のフリーズが発生する可能性があります。

効果的な解決策:BackgroundWorker の活用

BackgroundWorker クラスは、洗練されたソリューションを提供します。 これにより、長時間実行される操作を別のスレッドで実行できるようになり、UI のブロックが防止されます。 進行状況の更新はシームレスにメイン UI スレッドに中継されます。

実装手順

  1. BackgroundWorker の初期化:

    BackgroundWorker インスタンスを作成します:

    <code class="language-C#">BackgroundWorker backgroundWorker = new BackgroundWorker();</code>
    ログイン後にコピー
  2. イベント処理:

    BackgroundWorker のイベントを購読する:

    <code class="language-C#">backgroundWorker.DoWork += backgroundWorker_DoWork;
    backgroundWorker.ProgressChanged += backgroundWorker_ProgressChanged;
    backgroundWorker.RunWorkerCompleted += backgroundWorker_RunWorkerCompleted;</code>
    ログイン後にコピー
  3. バックグラウンド タスクの開始:

    以下を使用してバックグラウンド操作を開始します:

    <code class="language-C#">
    backgroundWorker.RunWorkerAsync();
    ```  This is typically triggered by a button click or similar UI event.</code>
    ログイン後にコピー
  4. 進捗報告:

    backgroundWorker_DoWork イベント ハンドラー内で、定期的に進行状況を報告します。

    <code class="language-C#">backgroundWorker.ReportProgress((j * 100) / totalIterations);</code>
    ログイン後にコピー
  5. UI プログレスバーの更新:

    backgroundWorker_ProgressChanged イベント ハンドラーは進行状況バーを更新します。

    <code class="language-C#">progressBar1.Value = e.ProgressPercentage;</code>
    ログイン後にコピー

イラストコード

この例はプロセスを示しています:

<code class="language-C#">private void Calculate(int i)
{
    // Your external calculation logic here...
    double result = Math.Pow(i, i); // Example calculation
}

private void button1_Click(object sender, EventArgs e)
{
    progressBar1.Maximum = 100;
    progressBar1.Value = 0;
    backgroundWorker.RunWorkerAsync();
}

private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
    BackgroundWorker worker = sender as BackgroundWorker;
    int totalIterations = 100000; // Adjust as needed

    for (int j = 0; j < totalIterations; j++)
    {
        Calculate(j);
        worker.ReportProgress((j * 100) / totalIterations);
    }
}

private void backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    progressBar1.Value = e.ProgressPercentage;
}

private void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    // Handle completion, e.g., display a message
    MessageBox.Show("Calculation complete!");
}</code>
ログイン後にコピー

このアプローチにより、計算負荷の高い外部計算を行った場合でも、明確な進行状況の視覚化を提供しながら、スムーズな UI の応答性が保証されます。堅牢性を確保するために、backgroundWorker_DoWork メソッド内で潜在的な例外を処理することを忘れないでください。

以上がUI をブロックせずに、外部計算の進行状況を WinForms プログレス バーに表示するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート