Laden...

Fortschrittsbalken

Erstellt von Akhanto vor 12 Jahren Letzter Beitrag vor 12 Jahren 3.306 Views
Thema geschlossen
A
Akhanto Themenstarter:in
28 Beiträge seit 2012
vor 12 Jahren
Fortschrittsbalken

Hallo,
ich möchte für mein Programm eine Fortschrittsleiste einbauen, die anzeigt wie weit es mit dem Kopieren von bestimmten Dateien ist. Hierfür habe ich in einer Kopieren-Klasse zwei Eigenschaften (int ZahlDateienGesamt und int ZahlDateienRest) erstellt und wollte dann im Hauptprogramm den Prozentwert ausrechnen und in den progrBar.Value übertragen. Bei meiner ersten Lösung hat er die GUI aktualisierung erst vorgenommen, als er komplett fertig war. Dann habe ich die Methode zum Kopieren in einen Hintergrundthread geschoben und versucht über eine while(Rest !=0) Schleife den Balken zu aktualisieren, jedoch passiert in diesem Fall gar nichts. Ich sitze mittlerweile den ganzen Tag an dem Problem und weder Google noch Bücher noch Bekannte konnten da sinnvoll weiterhelfen.


{
            objDA = new DateiAktionen(e.Drive);
            objDA.propStrPfad = strPfad;

            ThreadStart ThrStKopieren = new ThreadStart(objDA.Kopieren);
            Thread ThrKopieren = new Thread(ThrStKopieren);
            ThrKopieren.IsBackground = true;
            ThrKopieren.Start();

            while (objDA.propZahlDateienRest != 0)
            {
                progBarFortschritt.Value = objDA.propProzent;
            }
}

Das ist übrigens die Methode zum Kopieren:

        
public void Kopieren()
        {
        try
            {
                strOrdnername = "\\" + Microsoft.VisualBasic.Interaction.InputBox("USB-Stick gefunden! Bitte Ordnername eingeben!", "Ordnername") + "\\";
                
                if (!Directory.Exists(strPfad + strOrdnername))
                    Directory.CreateDirectory(strPfad + strOrdnername);

                if (boolDateienVorhanden)
                {
                    foreach (FileInfo fi in Dateien)
                    {
                        if(! File.Exists(strPfad + strOrdnername + fi.Name))
                        {

                            intZahlDateienAktuell++;
                            intZahlDateienRest--;
                            intProzent = intZahlDateienAktuell / intZahlDateien * 100;
                            System.IO.File.Copy((Convert.ToString(fi.FullName)), strPfad + strOrdnername + fi.Name, true);

                        }
                    }
                }
                else
                 System.Windows.MessageBox.Show("keine Dateien");
            }
            catch (Exception x)
            {
                System.Windows.MessageBox.Show(x.Message);
            }
        }

Hat hier jemand einen Tipp?

vielen dank
Akhanto

731 Beiträge seit 2006
vor 12 Jahren

Hi, ich kenne mich zu wenig im WPF Bereich aus um eine spezielle Antwort geben zu können.
Ich möchte eher anmerken, dass ich die Anzahl der Dateien für ein schlechtes Maß halte. Die (Gesamt-)Größe (Speicherplatz) halte ich für sinnvoller.

MfG
wax

F
18 Beiträge seit 2012
vor 12 Jahren

So müsste es gehen:

            while (objDA.propZahlDateienRest != 0)
            {
                progBarFortschritt.Value = objDA.propProzent;
                Application.Current.Dispatcher.Invoke(DispatcherPriority.Background, new ThreadStart(delegate { }));
                Thread.Sleep(200);
            }

Aber das ist eine unschöne Lösung, besser wäre du verwendest ein eigens erstelltes Event oder eine Datenbindung.

Dein Code kann so nicht funktionieren, da der GUI Thread die ganze Zeit in der Schleife "hängt" und keine Zeit hat die progBar zu aktualisieren.
Mit dem Befehl "Application.Current.Dispatcher.Invoke...." werden die "anstehenden" Aufgaben erledigt.
Mit eigenen Wort erklärt, ist vl. nicht 100%ig korrekt 😁

F
10.010 Beiträge seit 2004
vor 12 Jahren

@Akhanto:
[Hinweis] Wie poste ich richtig?
Hier wird in 1.1.1 auch darauf verwiesen das Du als einsteiger bitte erst die FAQ und Artikel durcharbeiten solltest, denn da steht das meiste schon beschrieben.
Artikel
FAQ

z.B.
[FAQ] Warum blockiert mein GUI?

K
34 Beiträge seit 2009
vor 12 Jahren

wenn du das verschieben in nen backgroundworker auslagerst, kannst du dir den fortschritt über die ReportProgress funktion des BGW zurückgeben lassen.
der anschaulichtkeit halber hab ich mal quick n dirtywas gebastelt... der ansatz sollte aber erkenntbar sein 😉



 public partial class MainWindow : Window
    {

        BackgroundWorker bgw = new BackgroundWorker();

        public MainWindow()
        {
            InitializeComponent();

            bgw.DoWork += new DoWorkEventHandler(bgw_DoWork);
            bgw.WorkerReportsProgress = true;
            bgw.ProgressChanged += new ProgressChangedEventHandler(bgw_ProgressChanged);
            bgw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bgw_RunWorkerCompleted);
        }

        void bgw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            progressBar1.Value = 100;
        }

        void bgw_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            App.Current.Dispatcher.Invoke(DispatcherPriority.Normal,(Action)delegate(){
                progressBar1.Value = e.ProgressPercentage;
            });
        }

        void bgw_DoWork(object sender, DoWorkEventArgs e)
        {
            for (int i = 0; i < 10000; i++)
            {
                if(i%100 == 0 )
                    bgw.ReportProgress(i/100);                
                Thread.Sleep(50);
            }
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            bgw.RunWorkerAsync();
        }
    }


6.862 Beiträge seit 2003
vor 12 Jahren

Hallo,

zum Ursprungscode: Der Thread bringt nichts, wenn du danach ne While Schleife hast die alles blockiert.

Wie man es besser macht, weißt du ja jetzt dank FZelle und dem Beispiel von Kao.

Nur kleine Anmerkung zu Kaos Code: Das Invoke in ProgressChanged ist nicht notwendig, da der Eventhandler automatisch durch den Backgroundworker in den GUI Thread dispatched wird.

Baka wa shinanakya naoranai.

Mein XING Profil.

Thema geschlossen