mercoledì 31 ottobre 2007

Gestire il controllo ProgressBar in un thread separato

Spesso capita che si vorrebbe mostrare un ProgressBar all'interno della nostra applicazione il problema è che non sempre è possibile gestire il controllo e far proseguire al nostro programma il suo normale lavoro.

Questo esempio mostra appunto come far apparire e gestire il controllo ProgressBar in un altro thread.

Il progetto è suddiviso in due parti, Form principale (MainForm) e Form di gestione ProgressBar (ProgressBarForm).

MainForm

La form principale genera un nuovo Thread e richiama su questo ProgressBar

void EseguiButtonClick(object sender, EventArgs e)

{

       int cicli;
       if (!int.TryParse(cicliTextBox.Text,out cicli))
             cicli = 20;
       ShowProgressBar();
      // facciamo qualche cosa
       for (int i = 0; i < cicli; ++i)
       {
             // mettiamo in pausa altrimenti non si vede niente
             System.Threading.Thread.Sleep(1000);

       }
       //Richiama il metodo di ProgressBarForm che lo fa chiudere
       this.progressBarForm.StopMessagePumpAndClose();
}
/// <summary>
/// Questo metodo genera un nuovo thread e richiama
/// CreateProgressWindowAndShow mettendolo in background
/// </summary>
private void ShowProgressBar()
{
     Thread t = new Thread(new ThreadStart(CreateProgressWindowAndShow));
      t.IsBackground = true;
      t.Start();
}
/// <summary>
/// Questo metodo richiama ProgressBarForm in un thread autonomo
/// usando Application.Run
/// </summary>

private void CreateProgressWindowAndShow()
{
    this.progressBarForm = new ProgressBarForm();
    Application.Run(this.progressBarForm);
}

 

ProgressBarForm

La form secondaria

/// <summary>
///
Utilizzato per chiudere la form dall'esterno

/// </summary>

public void StopMessagePumpAndClose()
{
      if (this.InvokeRequired)
      {
             this.Invoke(new MethodInvoker(StopMessagePumpAndClose));     

      }
      else
      {
             this.Close();
      }
}

 

Progetto di esempio C#

Progetto di esempio VB.NET

Nessun commento: