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();
}
}
Nessun commento:
Posta un commento