Laden...

Abbrechbarer Fortschrittsbalken, ohne dass das GUI blockiert

Erstellt von Matze91 vor 13 Jahren Letzter Beitrag vor 13 Jahren 2.485 Views
Thema geschlossen
M
Matze91 Themenstarter:in
12 Beiträge seit 2010
vor 13 Jahren
Abbrechbarer Fortschrittsbalken, ohne dass das GUI blockiert

Hey Leute,
in der Schule fangen wir grad mit GUI an.
Bisher haben wir nur Konsolenanwendungen programmiert.

Wir haben folgende Aufgabe bekommen:
Wir sollen einen Fortschrittsbalken einbinden, der wenn man auf "Start" klickt langsam "vollläuft".
DAs ist soweit auch kein Problem, nur man soll während des Ladevorgangs auch abbrechen können, also auf "Schließen" klicken und das Programm beendet sich.

Das ist aber nicht möglich so wie ich es gemacht habe:


        private void btt_start_Click(object sender, EventArgs e)
        {
            btt_start.Enabled = false;
            btt_reset.Enabled = false;
            for (int i = 0; i < 101; i++)
            {
                bar.Value = i;
                lbl_fortschritt.Text = i + " Prozent";
                Thread.Sleep(50);
            }
            btt_start.Enabled = true;
            btt_reset.Enabled = true;
        }

        private void btt_reset_Click(object sender, EventArgs e)
        {
            bar.Value = 0;
            lbl_fortschritt.Text = "0 Prozent";
        }

        private void btt_close_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }

Liegt ja dadran das "Thread.Sleep" das ganze Programm "stoppt" und man während dessen auch nichts machen kann.
Was kann ich statt Thread.Sleep verwenden?

Gruß,
Matze

2.891 Beiträge seit 2004
vor 13 Jahren
M
Matze91 Themenstarter:in
12 Beiträge seit 2010
vor 13 Jahren

Auf der Seite bin ich auch schon gelandet. Kann damit aber nicht wirklich was anfangen, wie ich Aktionen auslager und all das.
Hab ich noch nie gemacht 😕

R
169 Beiträge seit 2007
vor 13 Jahren

Ein Application.DoEvents() nach Thread.Sleep(x) sollte helfen.

M
Matze91 Themenstarter:in
12 Beiträge seit 2010
vor 13 Jahren

Sauber, vielen Dank das geht 😄
Wenn ich jetzt noch wüsste wieso und was das Ding macht wär ich vollends zufrieden^^
Ich werd mal schauen ob ich das auch selbst rausfinde...

1.665 Beiträge seit 2006
vor 13 Jahren

Ein Application.DoEvents() nach Thread.Sleep(x) sollte helfen. Dafür erntest du von mir gleich mal einen virtuellen Schlag auf den Hinterkopf 😃
Woher hast du diese Infos, das mit DoEvents() zu machen?

@ Matze91:
Der Weg geht über Thread/BackgroundWorker und dem Invoke auf die GUI, um die ProgressBar zu aktualisieren. Das sollte eigentlich alles in dem FAQ Artikel drin stehen. Schau bitte nochmal rein! [FAQ] Warum blockiert mein GUI?

Also Finger weg von Sleep und DoEvents.
Alternativ kannst du das auch mit einem Timer umsetzen, was aber an sich nicht viel Sinn macht.

Du kannst auch nochmal speziell nach "Thread Invoke GUI C#" googlen. Du solltest an nützlichen Informationen dann erschlagen werden.

M
Matze91 Themenstarter:in
12 Beiträge seit 2010
vor 13 Jahren

Sry, aber ich kann mir das auch 20mal durchlesen und würde nur Bahnhof verstehen.
Das geht schon los bei einer so grundlegenden Frage wie "Was ist ein Thread", über "Was ist ein ThreadPool" bis hin zu "Was ist ein BackgroundWorker"...

Und das waren nur die Fragen die auftauchen wenn ich mir das durchlese was dort als "Lösung" steht...

Hinweis von gfoidl vor 13 Jahren

Bitte keine Fullquotes - sind unnötig wenn die Antwort eh drüber steht 😉
Bitte beachte auch [Hinweis] Wie poste ich richtig? Punkt 2.3

A
118 Beiträge seit 2009
vor 13 Jahren

Ein Application.DoEvents() nach Thread.Sleep(x) sollte helfen.
Dafür erntest du von mir gleich mal einen virtuellen Schlag auf den Hinterkopf 😃
Woher hast du diese Infos, das mit DoEvents() zu machen?

Hallo,

Ehrlich gesagt finde ich solche Antworten (die man öfters hier im Forum lesen kann) wie z.B. "Application.DoEvents() ist schlecht..." nicht sehr hilfreich. So wird es z.B. im Galileo Open Book 2008 (ob es im 2010 auch noch so ist, weiss ich nicht) von Andreas Kühnel auch verwendet, weshalb man es als Anfänger durchaus als nützlich und gut ansehen kann, da es ja in so einem Buch als das vermittelt wird.

6.911 Beiträge seit 2009
vor 13 Jahren

Hallo,

Ehrlich gesagt finde ich solche Antworten (die man öfters hier im Forum lesen kann) wie z.B. "Application.DoEvents() ist schlecht..." nicht sehr hilfreich.

Die Aussage alleine ist nicht sehr hilfreich - da hast du recht. Aber es sollte zum Nachdenken anregen und wenn die Forensuche danach bemüht wird kann festgestellt werden dass dieses Theme des öfteren ausführlich diskutiert wurde.

Von daher ist eine erneute Diskussion über Application.DoEvents nicht unbedingt notwendig. Dass es im OpenBook verwendet wurde ist halt so, aber trotzdem sollte es nicht verwendet werden denn es gibt richtigere Möglichkeiten wie zB die Verwendung von Threads.

Ausführlicher ist das auch in [FAQ] Warum blockiert mein GUI? nachzulesen.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

4.221 Beiträge seit 2005
vor 13 Jahren

Ehrlich gesagt finde ich solche Antworten (die man öfters hier im Forum lesen kann) wie z.B. "Application.DoEvents() ist schlecht..." nicht sehr hilfreich.

Such hier im Forum mal nach "reentrant" dann findest Du die Gründe wieso viele von uns das DoEvents so hassen.

Gruss
Programmierhans

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

5.742 Beiträge seit 2007
vor 13 Jahren

Alternativ kannst du das auch mit einem Timer umsetzen, was aber an sich nicht viel Sinn macht.

Naja - für die Aufgabenstellung, einen Fortschrittsbalken, der langsam volläuft, zu schreiben, halte ich einen Timer für durchaus sinnvoll.
Lediglich den Sinn der Aufgabe an sich könnte man anzweifeln 😉

M
Matze91 Themenstarter:in
12 Beiträge seit 2010
vor 13 Jahren

Lediglich den Sinn der Aufgabe an sich könnte man anzweifeln 😉

Weiß nicht ob das alle mitbekommen haben, aber wir haben heute erst das zweite mal überhaupt über sowas gesprochen, und da müssen die Aufgaben nicht unbedingt Sinn machen^^
Aber egal, ich lass es einfach, hierbei kommt eh nichts rum

6.911 Beiträge seit 2009
vor 13 Jahren

Hallo,

Aber egal, ich lass es einfach, hierbei kommt eh nichts rum

Für deine Aufgabe finden sich im Forum mehrere Beispiele die zeigen wie es geht. Siehe zB [erledigt] ObjectDisposeException bei InvokeRequired abhandlung

Suchen macht schlau 😁

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

699 Beiträge seit 2007
vor 13 Jahren

Hallo Matze91,

Ehrlich gesagt finde ich solche Antworten (die man öfters hier im Forum lesen kann) wie z.B. "Application.DoEvents() ist schlecht..." nicht sehr hilfreich. So wird es z.B. im Galileo Open Book 2008 (ob es im 2010 auch noch so ist, weiss ich nicht) von Andreas Kühnel auch verwendet, weshalb man es als Anfänger durchaus als nützlich und gut ansehen kann, da es ja in so einem Buch als das vermittelt wird.

Ich hab das Buch ( 2008 ) auch hier stehen und am anfang damit die ersten Schritte unter C# gelernt. Ich kann das Buch durchaus immer einem Anfänger an die Hand legen, da man damit sehr gut voran kommt. Doch wenn ich nun, nachdem ich schon ein bisschen weiter bin als das Wissen was aus dem Buch stammt, darin etwas nachlesen will, stelle ich immer wieder fest, das auch dieses Buch schwachstellen besitzt und teilweise nicht tief genug die Materie vermittelt.

Deshalb mein Tip. Wenn Dir hier im Forum einer einen Tip gibt, das man etwas anders machen soll, als es in Büchern steht, dann sollte man sich auch mal aus dem Buchfenster lehnen und nach diesem Weg sich orientieren und vor allem Informieren.

Meistens wirst Du dann schnell feststellen, das wirklich bessere und manchmal auch einfachere Wege gibt, als das was in dem Buch steht.

Das sind nur meine Erfahrungen, die ich mit diesem Buch gemacht habe.
Ich habe mir die Tips aus dem Forum immer zu herzen genommen, und habe dadurch stellenweise ein viel tieferes Wissen erlangt, als durch das reine Buch.

Grüße Stephan

49.485 Beiträge seit 2005
vor 13 Jahren

Hallo Matze91,

wenn dein Lehrer eine Lösung für eine solche Aufgabe erwartet, dann ist davon auszugehen, dass ihr im Unterricht alles besprochen habt, was zur Lösung der Aufgabe erforderlich ist. Wenn ihr Threading noch nicht besprochen habt, ist es unwahrscheinlich, dass dein Lehrer eine Lösung mit Threading will, obwohl es bei langlaufenden Aktionen natürlich die einzig richtige und robuste Lösung ist und DoEvents nur eine Krücke, die man möglichst schnell wieder vergessen sollte. Aber beim Lernen muss man manchmal auch Umwege machen, nämlich genau dann, wenn noch nicht alle Hilfsmittel im Unterricht besprochen wurden.

Aber selbst wenn dein Lehrer eine Lösung mit Threading erwartet, ist ein Forum der falsche Ort, um dir solche grundlegenden Begriffe zu erklären. Dafür gibt es Bücher. Es ist nicht böse gemeint, wenn ich dir für diesen Fall den dringenden Rat gebe, bitte dort nachzuschauen.

Bitte beachte bei weiteren Fragen unbedingt [Hinweis] Wie poste ich richtig? Punkt 1.1.1.

Siehe auch [FAQ] Wie finde ich den Einstieg in C#?

herbivore

PS: Am Thread.Sleep liegt es übrigens nicht, dass dein GUI bloickiert, sondern daran, dass die langlaufende Aktion komplett im GUI-Thread läuft. Wenn du das Thread.Sleep aus der Schleife entfernen würdest und im Gegenzug die Schleife öfter durchlaufen würdest, so das sie im Ergebnis genauso lange läuft wie bisher, würde das GUI auch ganz ohne Thread.Sleep blockieren.

Thema geschlossen