Hallo Forum,
ich habe eine Main-Form mit einem Button, der eine Reihe von Methoden aufruft.
1. Infos sammeln
2. Dateien kopieren
3. Installation
4. andere Installation
5. Scripte ausführen usw.
also "klassisch" top-down. Pkt. 2 (Dateien kopieren) dauert ca. 5 min. daher will ich dem User einen ProgressBar-Balken zeigen, damit er nicht glaubt, das Programm ist abgestürzt (single-Thread=die Form "friert" ein). Es ist essentiell, dass der Pkt. 3 (Installation) auf Pkt. 2 (Kopieren) warten MUSS (sonst kann nicht installiert werden). Auch der Pkt. 4 (andere..) muss auf den Abschluss des Pkt. 3 (Installation) warten.
Wie gesagt, single-Thread kommt nicht in Frage und das Warten auf den Abschluss des Vorgängers bekomme ich nicht im Griff.
@Yuuri hat etwas ähnliches am 11.02.2011 präsentiert (Thread: DateiDownload mit Fortschrittsbalken).
Der Code:
Ich danke Euch für Hilfe
ich habe eine Main-Form mit einem Button, der eine Reihe von Methoden aufruft.
1. Infos sammeln
2. Dateien kopieren
3. Installation
4. andere Installation
5. Scripte ausführen usw.
also "klassisch" top-down. Pkt. 2 (Dateien kopieren) dauert ca. 5 min. daher will ich dem User einen ProgressBar-Balken zeigen, damit er nicht glaubt, das Programm ist abgestürzt (single-Thread=die Form "friert" ein). Es ist essentiell, dass der Pkt. 3 (Installation) auf Pkt. 2 (Kopieren) warten MUSS (sonst kann nicht installiert werden). Auch der Pkt. 4 (andere..) muss auf den Abschluss des Pkt. 3 (Installation) warten.
Wie gesagt, single-Thread kommt nicht in Frage und das Warten auf den Abschluss des Vorgängers bekomme ich nicht im Griff.
@Yuuri hat etwas ähnliches am 11.02.2011 präsentiert (Thread: DateiDownload mit Fortschrittsbalken).
Der Code:
Code:
delegate void ShowProgressDelegate(string target, int totalDigits, int digitsSoFar);
delegate void CalcDelegate(int digits);
void ShowProgress(string target, int totalDigits, int digitsSoFar)
{
//sind wir auf dem richtigen Thread??
if (lblProgressBar.InvokeRequired == false)
{
lblProgressBar.Text = target;
pBar1.Maximum = totalDigits;
pBar1.Value = digitsSoFar;
}
else //Progress zeigen asynchronously...
{
ShowProgressDelegate showProgress = new ShowProgressDelegate(ShowProgress);
//Invoke..
BeginInvoke(showProgress, new object[] {target,totalDigits,digitsSoFar });
}
}
public void AsyncCompleted(IAsyncResult ar)
{
AsyncResult result = (AsyncResult)ar;
try
{
((CalcDelegate)result.AsyncDelegate).EndInvoke(ar);
}
catch(Exception ex)
{
}
finally
{
WeiterMitPunkt3 //es klappt aber nicht.....ClearAfterCoping();
}
}
private void KopierenMitProgressBar(ArrayList myAl)
{
//ProgressBar einblenden..
this.pBar1.Visible = true;
CalcDelegate calcDel = new CalcDelegate(DoJob);
calcDel.BeginInvoke((int)myAl.Count, AsyncCompleted, null);
}
private void DoJob(int digits)
{
Object[] myal= myAl.ToArray();
//ShowProgress
ShowProgress("Kopieren: ", digits, 0);
if(digits>0)
{
for (int x = 0; x < digits; x++)
{
string input = myal[x].ToString().Substring(0, myal[x].ToString().IndexOf(","));
string target = myal[x].ToString().Substring(myal[x].ToString().IndexOf(",") + 1);
File.Copy(input, target, true);
//Show Progress..
ShowProgress("Kopieren: " + target, digits, x);
}
}
}