Maison >développement back-end >C++ >Comment mettre à jour une barre de progression WinForms lors de calculs asynchrones ?

Comment mettre à jour une barre de progression WinForms lors de calculs asynchrones ?

Barbara Streisand
Barbara Streisandoriginal
2025-01-14 11:47:43649parcourir

How to Update a WinForms ProgressBar During Asynchronous Calculations?

Guide d'utilisation de la barre de progression du calcul asynchrone WinForms

Lors de l'utilisation de bibliothèques externes qui effectuent de longs calculs, il est utile d'afficher une barre de progression pour fournir des commentaires à l'utilisateur. Dans WinForms, vous pouvez utiliser le contrôle ProgressBar à cette fin.

Utilisation de la barre de progression dans le calcul synchrone

Si les calculs sont effectués de manière synchrone dans votre classe Form, utilisez simplement la méthode PerformStep() pour incrémenter la ProgressBar une fois chaque calcul terminé. Par exemple :

<code class="language-csharp">private void button1_Click(object sender, EventArgs e)
{
    progressBar1.Maximum = 100000;
    progressBar1.Step = 1;

    for(int j = 0; j < 100000; j++)
    {
        // Perform calculation
        progressBar1.PerformStep();
    }
}</code>

Utilisation de la barre de progression dans le calcul asynchrone

Cependant, si le calcul est effectué de manière asynchrone dans une méthode externe, la ProgressBar ne peut pas être mise à jour directement à partir de cette méthode. Utilisez plutôt la classe BackgroundWorker pour effectuer des calculs et signaler la progression au thread de l’interface utilisateur.

Utiliser BackgroundWorker

La classe BackgroundWorker vous permet d'effectuer des opérations fastidieuses dans un thread séparé tout en fournissant des mises à jour de progression au thread principal de l'interface utilisateur. Il dispose d'une méthode ReportProgress qui vous permet de renvoyer le pourcentage de progression au thread de l'interface utilisateur.

Ce qui suit est un exemple utilisant BackgroundWorker :

<code class="language-csharp">private void button1_Click(object sender, EventArgs e)
{
    progressBar1.Maximum = 100;
    progressBar1.Step = 1;
    progressBar1.Value = 0;
    backgroundWorker.RunWorkerAsync();
}

private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
    var backgroundWorker = sender as BackgroundWorker;
    for (int j = 0; j < 100; j++)
    {
        // Perform calculation
        backgroundWorker.ReportProgress(j);
        Thread.Sleep(100); // 模拟耗时操作
    }
}

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

Dans cet exemple, le calcul est effectué dans la méthode backgroundWorker_DoWork, tandis que la méthode backgroundWorker_ProgressChanged est utilisée pour mettre à jour la ProgressBar sur le thread de l'interface utilisateur.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn